当我编程时,我经常用第三方软件包进行实验。当然,它们是通过pip安装的。安装后,包将安装它们的依赖项。
最后,我希望有一个干净的requirements.txt,它反映了项目真正需要的包(pip冻结> requirements.txt)。
如果我设法找到一个更好的软件包解决方案,我会通过pip卸载它。问题是,当卸载时,包不会卸载它的依赖项。如果我没有弄错的话,这就不是了。嗯,当我让pip冻结的时候,我不知道这里发生了什么。
因此,我决定记录下安装了哪个软件包。卸载时,我会手动卸载它们。
但这确实很麻烦,而且容易出错:
pip freeze > requirements.txt
asgiref==3.2.3
Django==3.0.2
pkg-resources==0.0.0
pytz==2019.3
sqlparse==0.3.0编辑requirements.txt:
asgiref==3.2.3 # Django dependency
Django==3.0.2 # Django
pkg-resources==0.0.0 # Default package
pytz==2019.3 # Django dependency
sqlparse==0.3.0 # Django dependency当我安装一个新的软件包时,我会使pip冻结>Requiments1.txt。然后比较这些文件,显示新安装的包的依赖项,标记它们,然后复制粘贴旧注释。
好吧,最后我可以把它弄得一团糟。我让点子冻结,并明白,我只是不知道哪个包取决于哪个,因为我只是忘了发表我的意见或什么。
这也是我的目标:当我在一年内完成我的项目时,我想确切地知道:
你能告诉我什么是最好的做法吗?
发布于 2020-01-26 16:26:59
pip-工具似乎正是解决您在开发工作流程中遇到的问题所需要的工具。
pip-tools使您能够指定高级别依赖项(例如Django),同时自动处理低级别依赖项(例如pytz)。它还使您能够将您的环境同步到一个requirements.txt文件,而不管您可能有什么混乱的状态。
在项目中安装pip-tools
要使用pip-tools,首先在项目中创建一个新的空Python虚拟环境,并使用您选择的工具激活它:
python3 -m venv .venv && source .venv/bin/activatepyenv virtualenv 3.8.1 project-env && pyenv local project-env然后,在项目的Python虚拟环境中安装pip-tools:
pip install pip-tools使用pip-compile使用requirements.in文件管理依赖项
pip-tools包括一个以requirements.in文件作为输入的pip-compile工具。这个requirements.in文件类似于requirements.txt,但它只包含较高级别的依赖项。例如,如果您的项目使用的是Django的最新版本,您可以在requirements.in中编写类似的内容
django>=3.0,<3.1您可以看到,requirements.in不包含Django的依赖项,只包含Django本身。
在requirements.in中设置了依赖项之后,使用pip-compile将requirements.in“编译”为requirements.txt文件:
➜ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile requirements.in
#
asgiref==3.2.3 # via django
django==3.0.2
pytz==2019.3 # via django
sqlparse==0.3.0 # via django由requirements.txt生成的pip-compile文件指示包名旁边的每个间接依赖项的来源。例如,pytz==2019.3是django的依赖项。此外,它还将每个依赖项固定在一个精确的版本号上,以确保您的依赖项的安装是可重复的。
将生成的requirements.txt的依赖项应用于pip-sync
既然您有了一个requirements.txt,就可以使用pip-sync在您的Python虚拟环境中应用它了。
➜ pip-sync requirements.txt
Collecting asgiref==3.2.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 1))
Using cached https://files.pythonhosted.org/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl
Collecting django==3.0.2 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 2))
Using cached https://files.pythonhosted.org/packages/55/d1/8ade70e65fa157e1903fe4078305ca53b6819ab212d9fbbe5755afc8ea2e/Django-3.0.2-py3-none-any.whl
Collecting pytz==2019.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 3))
Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
Collecting sqlparse==0.3.0 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 4))
Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Installing collected packages: asgiref, pytz, sqlparse, django
Successfully installed asgiref-3.2.3 django-3.0.2 pytz-2019.3 sqlparse-0.3.0通过卸载和安装相关的软件包,pip-sync将确保您的虚拟环境与requirements.txt文件中定义的内容完全一致。
在您的环境被同步之后,确保您的项目代码正常工作。如果是的话,将requirements.in和requirements.txt提交到版本控制中。
参考文献
有关更多细节,您可以参考pip工具文档或Hynek:2018年Python应用程序依赖关系管理的文章。
发布于 2020-01-26 15:40:31
依赖关系管理在python领域比其他地方要粗糙一些,有一些像诗歌和pipenv这样的工具,但是仅仅为了戳一圈,我会尝试下面的方法。
我不认为这是最佳实践,但这是一个开始,应该让您在决定在dep管理工具方面加入哪个方面之前:)
https://stackoverflow.com/questions/59919609
复制相似问题