如何解决Python包依赖问题

以简洁高效(指编程较为高效, 而不是运行速度)出名的Python, 在包依赖问题上有时候让人挠头.

一些新手复制了Github上的项目准备运行, 很多时候会在包依赖这一步上卡个半天. (这里推荐新手最好在基于Linux的系统或者Mac上, 一些包[比如Scrapy的Win32相关依赖]可能无法直接通过包管理工具安装, 会让新手从入门到放弃). 其他涉及到项目需要到其他机器部署时, 也会遇到包依赖问题.

# 这可能是部署过程中最常见的错误
ModuleNotFoundError: No Module named 'XXX'

通过pip输出依赖

pip freeze > requirements.txt

这个命令可能是很多同学用来输出依赖的命令, 但它输出的是当前环境下(笔者默认你使用的是Python的虚拟环境)的所有包, 也就是输出当前你安装的全部非Python标准库包)

笔者在自己终端上试了一下, 输出的文件如下: (这里暴露了我没有按项目建虚拟环境的烂习惯(逃)

# 省略N个库
....
Django==1.11.8
django-mongonaut==0.2.21
docopt==0.6.2
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-Login==0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.1
Flask-PageDown==0.1.4
Flask-Script==0.6.6
Flask-SQLAlchemy==1.0
Flask-WTF==0.9.4
ForgeryPy==0.1
html5lib==1.0b3
hyperlink==17.3.1
idna==2.6
incremental==17.5.0
itsdangerous==0.23
Jinja2==2.7.1
lxml==4.1.1
Mako==0.9.1
Markdown==2.3.1
MarkupSafe==0.18
mongoengine==0.9.0
numpy==1.14.0
pandas==0.22.0
parsel==1.3.1
pdfkit==0.6.1
pipreqs==0.4.9
pyasn1==0.4.2
pyasn1-modules==0.2.1
pycparser==2.18
PyDispatcher==2.0.5
pymongo==2.8
PyMySQL==0.7.9
pyOpenSSL==17.5.0
python-dateutil==2.6.1
pytz==2017.3
queuelib==1.4.2
requests==2.18.4
requests-file==1.4.3
scrape==0.9.12
Scrapy==1.5.0
...
# 省略N+1个库

对于按项目建环境的同学, 这种输出方式是没有多大问题的.

只要部署的时候在终端键入 pip install-r requirements.txt就可以安装好依赖了, 但是对于没有严格区分项目环境的同学, 一次性安装了其他的包, 并不是一个好的解决方案.

通过pipreqs库输出依赖

如这个库的名称所示, 就是为了方便管理依赖而生.

与pip直接导出全部不同, pipreqs只导出指定项目下Python文件import的库用法如下

# 安装
pip install pipreqs
# 切换到项目目录
# 输出requirements.txt到项目根目录下
pipreqs --use-local ./

这里我切换到一个Django项目目录下, 打开requirements.txt, 内容是:

pandas==0.22.0
django_debug_toolbar.egg==info
mongoengine==0.9.0
Django==1.11.8

瞬间清爽不少.

通过Pipenv管理依赖

Pipenv, 汇集了Pip,Pipfile和Virtualenv的功能,是一个强大的命令行工具。

这里展示最简单的用法

  1. pip install pipenv安装好库.
  2. 切换到项目根目录
  3. 终端键入 Pipenvinstall

如果你尚未建立 requirements.txt那么将会得到一个空白的 Pipfile文本文件 此时我们在命令行中使用 pipenv install包名, 会在Pipefile写入对应包信息, 之后用户要安装依赖时, 使用 pipenv install即可. 如果你已经建立, 终端上会输出以下信息:

requirements.txt found, instead of Pipfile! Converting…
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did. 
We recommend updating your Pipfile to specify the "*" version, instead.
...

上面的输出意思是:

找到了requirements.txt, 但不是Pipfile, 正在转换... Pipefile现在将包含固定版本信息, 如果你的requirements.txt中已包含. 我们推荐升级你的Pipefile到指定版本...

输出Pipenv文件, 得到以下内容:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
mongoengine = "==0.9.0"
"django-debug-toolbar.egg" = "==info"
django = "==1.11.8"
pandas = "==0.22.0"

[dev-packages]

[requires]
python_version = "3.6"

可以清楚的看到整个文件结构

第一个是[source]是安装库所在源, 第二个是依赖库的信息, 第三个是当你开发环境所需要的包, 最后一个是Python版本.

当你需要区分开发环境和正式版本发布环境时, 可以使用以下命令:

pipenv install --dev 包名

如果正式版本发布时, 键入 Pipenvinstall, 将不会安装dev标记的包 除非其他开发人员键入 Pipenvinstall-dev, 才会安装所有包.


入门小白, 欢迎大家指出错误, 技术交流

今日作者: 光光同学_

不爱看电影的摄影师不是好的程序员

原文发布于微信公众号 - 程序员的碎碎念(gh_53e607dd4782)

原文发表时间:2018-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

Pentester Lab SQL to shell

首先先介绍一款工具,个人觉得老牛逼——Netdiscover,之前我询问一哥们arp扫描工具时他推荐的。

10000
来自专栏北京马哥教育

Windows10+Ubuntu双系统安装

最近因为毕设重新回归Ubuntu,手头有一台装了Win10的ThinkPad X240s,最终成功完成了Windows 10 教育版和Ubuntu Kylin ...

83960
来自专栏听雨堂

Apache+wsgi+flask部署

flask自带的web server是开发用途,并不适用与发布,需要借助专业的web服务器。 配置的坑无数,Apache部署,403禁止,莫名其妙无法访问,50...

40790
来自专栏软件测试经验与教训

看图说话:持久式XSS(跨站)漏洞示例

读书与实践是获取知识的主要渠道,学习的权力只掌握在每个人自己手中,让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!

26320
来自专栏用户2442861的专栏

python项目打包部署

作者:张博 链接:https://www.zhihu.com/question/38081354/answer/81829426 来源:知乎 著作权归作者...

4.4K10
来自专栏张戈的专栏

Linux下巧用chattr、watch命令的实例

一、起因 前些日子,张戈在日志备份服务器加入了日志压缩的计划任务(详见服务器日志备份超节省空间的思路),结果发现监控总是发来 tar 的报警,提示存在 tar ...

36680
来自专栏美团技术团队

Redis高负载下的中断优化

Redis 服务端的总体请求量从年初最开始日访问量百亿次级别上涨到高峰时段的万亿次级别,给运维和架构团队都带来了极大的挑战。

1.2K110
来自专栏张善友的专栏

Nagios:企业级系统监控方案

在大多数情况下Cacti + RRDtool已经实现对系统各种参数的监测。但很多企业可能不满足于仅仅监测系统基本参数的需求,而是需要监测除基本参数之外的各种应用...

27550
来自专栏美团技术团队

LsLoader——通用移动端Web App离线化方案

背景 由于JavaScript(以下简称JS)语言的特性,前端作用域拆分一直是前端开发中的首要关卡。从简单的全局变量分配,到RequireJS实现的AMD模块方...

470170
来自专栏NetCore

怎样制作GHOST系统盘

制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取...

48280

扫码关注云+社区

领取腾讯云代金券