给服务器上的Python安装包,核心结论就一句话:先判断服务器有没有外网,有外网直接用pip装,没外网就下载whl文件离线装,注意Python版本和系统架构匹配就行。
判断场景:服务器上python安装包怎么装取决于这三点
在动手之前,先想清楚自己的处境,连环境都没摸清就一顿操作,很容易出现“装上了但跑不起来”的尴尬,说白了,服务器装包要考虑的事情比本地电脑多,主要看三件事:
- 服务器有没有外网,能联网,一切好说;不能联网,就得另想辙。
- Python版本,不同版本对包的兼容性差别很大,比如Python 3.6装新版pandas会直接报错。
- 系统架构,Linux服务器通常分x86_64和aarch64,很多预编译包分平台,下错了装不上。
做个简单的自查操作:登录服务器,运行python3 -V查看Python版本,运行uname -m查看架构,再试一下ping baidu.com,只要不报“Name or service not known”或者超时,基本能判断网络情况。
有外网环境:pip安装Python包是最省事的路
如果服务器能正常访问公网,那直接在终端里执行一条命令就完事。
pip install 包名
但痛点大家应该都遇到过:直接装速度慢得感人,尤其是一些体积大的包,动不动就卡在“Downloading”那一步,据统计,相当一部分pip超时问题都出在默认连接国外源上,这个问题的解决办法很成熟:换国内镜像源。
用国内镜像源提速,pip安装python包速度慢的问题就解决了
国内常用的镜像源有三个:清华、简米云、豆瓣,临时指定一个源来安装,命令长这样:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
如果不想每次手动加参数,可以配置全局默认源,执行下面的命令,改完以后pip默认就走镜像了。
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
这里提醒一句:某些公司内部服务器会禁止访问外部镜像站,但允许访问内网自建的源,这种环境就把https://mirrors.aliyun.com/pypi/simple/替换成公司提供的仓库地址即可。
分清pip和pip3,别装错环境
服务器上多个Python版本共存是常事,一个Python 2的老项目,一个Python 3的新业务,都可能在跑,这时候pip install装到哪个环境就不确定了,稳妥的做法是:
- 用
python3 -m pip install 包名,明确指定装到Python 3下面。 - 用
python3 -m venv venv建虚拟环境,再激活后安装包,这是最推荐的方式,后面专门讲。
就算只有一个Python环境,养成用python3 -m pip的习惯也没坏处,至少不会在报错时找不到到底是哪个pip在干活。
服务器离线安装python包的操作流程
内网服务器严禁连接外网是很多公司的安全红线,但是业务代码照跑,该装的新包还得装,这就是典型的需求场景:服务器离线安装python包。
核心思路不复杂:在一台有网的机器上把包和依赖全部下载好,传到目标服务器上,再本地安装。
第一步:在有网的机器上下载安装包
前提条件:下载机器的Python版本、系统架构和服务器保持一致,在下载机上执行:
pip download 包名 -d /tmp/packages -r requirements.txt
这里顺手解释一下这个命令的意思:
-d /tmp/packages:指定下载路径。-r requirements.txt:如果你的项目有依赖清单文件,就一并带上;没有就省略。
下载出来的是一堆.whl或者.tar.gz文件。.whl是预编译好的,装起来更快,优先选这种。.tar.gz通常是源码包,安装时需要在服务器上现场编译,费时费力,除非没得选,否则尽量避开。
第二步:把文件传到服务器上
常用手段是scp或sftp,命令示例:
scp -r /tmp/packages root@服务器IP:/home/user/packages
如果路径中包含中文名或者特殊符号,用scp时注意转义,熟练使用sftp工具如FileZilla、Xftp的操作逻辑,拖拽上传会直观一些。
第三步:在服务器上批量本地安装
登录服务器,进入包所在目录,执行:
pip install --no-index --find-links=/home/user/packages 包名
重点是--no-index参数,它明确告诉pip“别去网上搜”,直接从本地目录找,如果下载时带了requirements文件,也可以直接:
pip install --no-index --find-links=/home/user/packages -r requirements.txt
这套流程跑下来,离线环境就装好了,行业内不少运维同行日常就是这么干的,本质就是把联网服务器的缓存搬过来,不需要任何深奥技巧。
管理已安装的Python包:查询、升级、卸载
装包只是开始,日常管理同样有讲究,这些命令不用死记,但要熟悉到看见就条件反射。
查看当前环境装了哪些包
pip list
会列出所有包名和版本号,适合快速确认某个包是否已存在,如果想看具体某个包的信息,用:
pip show 包名
这会显示包的版本、依赖、安装路径等详细信息,排查问题的时候经常用到。
升级指定包
升级有两种,一种是单包升级:
pip install --upgrade 包名
另一种是全量升级,但说实话不太推荐,因为把所有包都升级一遍很容易引入版本冲突,多数情况下,按项目需求精确升级是更稳的选择。
卸载不需要的包
pip uninstall 包名
会先问一次是否确认,回车默认同意,批量卸载时可以用pip uninstall -r uninstall.txt这种方式批量处理。
把当前环境导出成清单文件
pip freeze > requirements.txt
这个命令太有用了,当你要把本地跑的代码部署到全新的服务器上,先把用户本地的包清单导出,再配合前面的离线下载流程,可以完整还原环境,行业共识认为,pip freeze是环境迁移过程中性价比最高的方法。
用虚拟环境隔离项目,给Python包“划地盘”
前面几次提到虚拟环境,这里展开说,很多服务器上跑着不止一个Python项目,不同项目依赖的包版本经常互不兼容,比如项目A需要Django 3.x,项目B还在用Django 2.x,全局装一个必然会出问题。
解决办法就是虚拟环境,它相当于给每个项目独立划出一块地盘,互不干扰。
创建并激活虚拟环境
进入项目目录,执行:
python3 -m venv venv source venv/bin/activate
激活成功后,命令行前面会多出(venv)前缀,表示当前已经在这个环境里了,这时执行pip install,只会装到当前虚拟环境,不会碰系统全局环境。
退出虚拟环境
deactivate
虚拟环境的目录一般放在项目内部,删除项目时直接删掉即可,不残留系统级污染,这是目前生产环境里用得最多的隔离手段。
宝塔面板里怎么给Python项目独立环境
如果你用的是宝塔面板管理网站,操作路径会更直观,打开宝塔面板,左侧菜单找到“网站”或者“Python项目”,新建项目时选择“Python项目管理器”,设置Python版本,勾选“创建虚拟环境”,面板会自动生成一个独立的Python环境,之后点击“依赖包”选项,直接搜索安装nginx、uwsgi这些模块,不需要手动敲命令。
许多使用酷番云、简米云等云服务器部署Python站点的用户,用宝塔面板就是图这里省事,尤其当服务器上同时跑多个PHP和Python站点时,面板式的环境隔离管理比纯命令行对新手友好很多。
服务器上给python安装包的常见问题解答
为了不让你绕路,下面把实际工作中最高频的三个问题直接回答了。
服务器上python安装包跟电脑上安装有什么不同吗?
最大的不同在于运行环境可能被多个使用者共享,碰了不该碰的全局环境会影响其他人,第二个差异是服务器通常缺少图形界面,所有操作依赖终端命令,没有可视化安装向导,操作本质一致,但更强调规范和隔离。
pip install提示“Requirement already satisfied”是装完了吗?
提示这条信息说明这个包在指定环境里已经存在,pip不会重复安装,需要确认版本是否满足要求可运行pip show 包名查看详细信息,如果版本偏低想升级,显式执行pip install --upgrade 包名即可。
内网根本没有外网,也没法用pip下载吗?
可以绕开pip下载这一步,在有公网的机器上执行pip download把.whl文件下载到本地,再拷贝进内网服务器,用pip install --no-index --find-links=离线目录 包名完成install,只要下载机和目标机的Python版本一致,这个方案基本百试百灵。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/772680.html


