有时我从那里下载 python 源代码github
,但不知道如何安装所有依赖项。如果没有requirements.txt
文件,我必须手动创建它。
问题是:
给定 python 源代码目录是否可以requirements.txt
从导入部分自动创建?
19 回答
您可以使用以下代码生成 requirements.txt 文件:
pip install pipreqs
pipreqs /path/to/project
更多关于 pipreqs 的信息可以在这里找到。
有时您会遇到pip freeze
,但这会保存环境中的所有包,包括您当前项目中未使用的包。
在我的情况下,我使用 Anaconda,所以从我的环境中的 conda 终端运行以下命令解决了它,并requirements.txt
自动为我创建了这个文件:
conda list -e > requirements.txt
这是取自这个 Github 链接pratos/condaenv.txt
如果出现错误,并且您正在使用 anaconda,请尝试使用以下.yml
选项:
conda env export > <environment-name>.yml
供其他人使用环境,或者如果您正在另一台机器上创建新环境:
conda env create -f <environment-name>.yml
对于 python3:(我的机器上有 python 2 和 3,其中 python2 是默认值)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
蟒蛇2:
pip install pipreqs
python -m pipreqs.pipreqs .
要检查您的 python 版本:
python --version
要创建需求 Python 模块列表,请在终端中编写以下代码:
pip3 freeze > requirements.txt
首先,您的项目文件必须是 py 文件,即直接 python 文件。如果您的文件是 ipynb 格式,您可以使用下面的代码行将其转换为 py 类型:
jupyter nbconvert --to=python
然后,您需要从 cmd(mac 终端)安装 pipreqs 库。
pip install pipreqs
现在我们可以使用下面的代码创建 txt 文件。如果您与文件在同一路径中,则只需编写 ./ 。否则,您需要提供文件的路径。
pipreqs ./
或者
pipreqs /home/project/location
这将为您的项目创建一个 requirements.txt 文件。
我盲目地遵循使用 pip3 freeze > requirements.txt 的公认答案
它生成了一个巨大的文件,列出了整个解决方案的所有依赖项,这不是我想要的。
所以你需要弄清楚你想要生成什么样的 requirements.txt。
如果您需要一个包含所有依赖项的 requirements.txt 文件,请使用 pip3
pip3 freeze > requirements.txt
但是,如果你想生成一个只列出你需要的依赖项的最小 requirements.txt,那么使用 pipreqs 包。如果您在项目的每个组件级别中有大量 requirements.txt 文件,而不是解决方案级别的单个文件,则特别有用。
pip install pipreqs
pipreqs [path to folder]
e.g. pipreqs .
pipreqs . --force --ignore=tests (Overwrites exisiting requirements.txt, ignores the tests directory)
确保为 python3.7 运行 pip3。
pip3 freeze >> yourfile.txt
在执行上述命令之前,请确保您已经创建了一个虚拟环境。
蟒蛇3:
pip3 install virtualenv
python3 -m venv <myenvname>
蟒蛇2:
pip install virtualenv
virtualenv <myenvname>
之后将您的源代码放入目录中。如果您现在运行 python 文件,如果您使用非本机模块,它可能不会启动。pip3 install <module>
您可以通过运行或来安装这些模块pip install <module>
。
除了您所在的环境之外,这不会影响您的整个模块列表。
现在您可以执行顶部的命令,现在您有一个需求文件,其中仅包含您在虚拟环境中安装的模块。现在您可以运行顶部的命令。
我建议每个人都使用环境,因为这样可以让事情变得更容易。
有点令人兴奋,这个简单的任务在 Python 中如此复杂。这是我认为自动执行此操作的最佳方法。
你需要两个工具:
1. pipreq
pip3 install pipreqs
pipreqs 将遍历您的项目并仅安装您的项目使用的包。而不是你的python环境中的所有包pip freeze
。
但是这种方法有一个问题。它不安装子包。
例如,您的项目使用pandas==1.3.2
. pandas
本身numpy==1.21.2
在其他软件包中使用。但是pipreqs
本身并没有在里面写子包(即numpy)requirments.txt
这是您需要pipreqs
与第二个工具结合使用的地方。
pip3 install pip-tools
pip-tools
将接收包requirements.in
并生成requirements.txt
包含所有子包的包。例如,如果您有
pandas==1.3.2
in requirements.in
,pip-tools
将生成
numpy==1.21.2 # via pandas
在requirements.txt
.
但是您需要手动将包添加到requirements.in
. 这很容易出错,你可能会偶尔忘记这样做。
这是您可以使用第一个工具的地方。
但是这两个工具都写入requirements.txt
. 那么如何解决呢?
使用 --savepath
for代替 defaultpipreqs
写入。requirements.in
requirements.txt
在一个命令中完成;做就是了
pipreqs --savepath=requirements.in & pip-compile
你去吧。现在您无需担心手动维护包,您requirements.txt
将拥有所有子包,因此您的构建是确定性的。
TL;博士
pip3 install pipreqs
pip3 install pip-tools
使用以下内容构建确定性requirements.txt
pipreqs --savepath=requirements.in && pip-compile
如果面临与我相同的问题,即不在虚拟环境中,并且需要特定项目或所选文件夹(包括子文件夹)的 requirements.txt,并且 pipreqs 不支持。
您可以使用 :
import os
import sys
from fuzzywuzzy import fuzz
import subprocess
path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"
files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.py'):
pyfiles.append(os.path.join(root, file))
stopWords = ['from', 'import',',','.']
importables = []
for file in pyfiles:
with open(file) as f:
content = f.readlines()
for line in content:
if "import" in line:
for sw in stopWords:
line = ' '.join(line.split(sw))
importables.append(line.strip().split(' ')[0])
importables = set(importables)
subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)
with open(path+'/requirements.txt') as req:
modules = req.readlines()
modules = {m.split('=')[0].lower() : m for m in modules}
notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']
new_requirements = []
for req_module in importables:
try :
new_requirements.append(modules[req_module])
except KeyError:
for k,v in modules.items():
if len(req_module)>1 and req_module not in notList:
if fuzz.partial_ratio(req_module,k) > 90:
new_requirements.append(modules[k])
new_requirements = [i for i in set(new_requirements)]
new_requirements
with open(path+'/requirements.txt','w') as req:
req.write(''.join(new_requirements))
PS:它可能有一些额外的库,因为它检查模糊逻辑。
Python 3 的最佳方法是:
pip3 freeze > requirements.txt
它对我有用...
如果您在系统中安装了许多依赖项,并且特定项目需要 requirements.txt,则可以先安装 pipreqs:
$ pip install pipreqs
并在项目文件夹下执行以下命令。
$ pipreqs
此命令将为特定项目生成 requirements.txt 文件。
简单的 Pythonic 方式
要获取标准文件中所有REQUIREMENTSrequirements.txt
的列表,可以使用以下命令。
pip freeze > requirements.txt
现在,这应该会自动创建一个标准要求文件,其中包含所有安装的软件包及其相应版本。
终端上的漂亮打印
如果您只想在终端上获得漂亮的打印效果,可以使用以下方法。
pip list
这以漂亮的打印格式列出了所有已安装的软件包。
自定义依赖
如果你有一个项目文件夹,比如 Github Repo,并且你想获得项目的自定义 requirements.txt,你可以使用以下包。
https://pypi.org/project/pipreqs/ pipreqs
用法
$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
requirements.txt 的内容
wheel==0.23.0
Yarg==0.1.9
docopt==0.6.2
自动 requirements.txt 更新方法
在使用requirements.txt开发 python 应用程序时,我们有几个选择:
- 开发后生成 requirements.txt,当我们要部署它时。它由
pip freeze > requirements.txt
或pipreqs
为了不那么混乱的结果执行。 - 每次安装后手动将每个模块添加到 requirements.txt。
- 安装将为我们处理 requirements.txt 更新的管理器。
1-st 选项有很多答案,2-d 选项是不言自明的,所以我想描述 3-d 方法。有一个名为to-requirements.txt的库。要安装它,请键入:
pip install to-requirements.txt # Pip install to requirements.txt
如果您一次阅读整个命令,您会看到它的作用。安装后你应该设置它。跑:
requirements-txt setup
它覆盖 pip 脚本,以便pip install
使用pip uninstall
所需版本的包自动更新项目的 requirements.txt 文件。覆盖是安全的,因此在卸载此包后 pip 将表现正常。
您可以自定义它的工作方式。例如,全局禁用它并仅对需要的目录激活它,仅对 git 存储库激活它,或者如果它不存在则允许/禁止创建 requirements.txt 文件。
链接:
如果您只想列出 virtualenv 中使用的包,请使用:
pip freeze -l > requirements.txt
不是一个完整的解决方案,但可能有助于在 Linux 上编译一个候选名单。
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > requirements.txt
我创建了这个 bash 命令。
for l in $(pip freeze); do p=$(echo "$l" | cut -d'=' -f1); f=$(find . -type f -exec grep "$p" {} \; | grep 'import'); [[ ! -z "$f" ]] && echo "$l" ; done;
@Francis 说得对 - https://stackoverflow.com/a/65728461/1021819
但只是补充一下:
通过对 Jupyter 笔记本(即文件)的额外支持,.ipynb
您现在可以使用https://pypi.org/project/pipreqsnb(与 pipreqs 的语法相同):
pip install pipreqsnb
pipreqs .
【我不是作者】
如果您使用的是 PyCharm,当您打开或将项目克隆到 PyCharm 中时,它会显示一个警报并要求您安装所有必要的包。