自动创建 requirements.txt
Automatically create requirements.txt
有时我从 github
下载 python 源代码,但不知道如何安装所有依赖项。如果没有 requirements.txt
文件,我必须手动创建它。
问题是:
给定 python 源代码目录是否可以从导入部分自动创建 requirements.txt
?
您可以使用以下代码生成requirements.txt文件:
pip install pipreqs
pipreqs /path/to/project
可以找到更多与 pipreqs 相关的信息 here。
有时您会遇到 pip freeze
,但这会保存环境中的所有包,包括那些您在当前项目中不使用的包。
建议使用 Pipenv 或其他工具来改进您的开发流程。
pip3 freeze > requirements.txt # Python3
pip freeze > requirements.txt # Python2
如果您不使用虚拟环境,pigar将是您不错的选择。
在我的例子中,我使用的是 Anaconda,所以 运行 我环境中 conda 终端的以下命令解决了它,并自动为我创建了这个 requirements.txt
文件:
conda list -e > requirements.txt
这是从这个 Github link pratos/condaenv.txt
如果出现错误,并且您正在使用 anaconda,请尝试使用 .yml
选项:
conda env export > <environment-name>.yml
供其他人使用该环境,或者如果您要在另一台机器上创建新环境:
conda env create -f <environment-name>.yml
确保 运行 pip3 for python3.7.
pip3 freeze >> yourfile.txt
在执行上述命令之前,请确保您已经创建了一个虚拟环境。
python3:
pip3 install virtualenv
python3 -m venv <myenvname>
python2:
pip install virtualenv
virtualenv <myenvname>
之后将您的源代码放入目录中。如果您现在 运行 python 文件,如果您使用非本机模块,它可能不会启动。您可以通过 运行ning pip3 install <module>
或 pip install <module>
.
安装这些模块
除了你所在的环境,这不会影响你的整个模块列表。
现在你可以执行顶部的命令,现在你有一个需求文件,其中只包含你在虚拟环境中安装的模块。现在您可以运行顶部的命令。
我建议每个人都使用环境,因为它可以让事情变得更容易。
如果面临与我相同的问题,即 不在虚拟环境中 并且想要 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))
P.S:它在检查模糊逻辑时可能有一些额外的库。
Python3 的最佳方法是:
pip3 freeze > requirements.txt
对我有用...
不是一个完整的解决方案,但可能有助于在 Linux 上编制一份候选名单。
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > 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 冻结 > 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)
我创建了这个 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;
如果你只想列出在 virtualenv 中使用的包,请使用:
pip freeze -l > requirements.txt
如果您的系统中安装了很多依赖项,并且您需要requirements.txt用于特定项目,您可以先安装pipreqs:
$ pip install pipreqs
并在项目文件夹下执行以下命令
$ pipreqs
此命令将为特定项目生成 requirements.txt 文件。
简单的 Pythonic 方式
要在标准 requirements.txt
文件中获取所有 REQUIREMENTS 的列表,您可以使用以下命令。
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
要创建需求 Python 模块列表,请在您的终端中编写此代码:
pip3 freeze > requirements.txt
对于 python3:(我的机器上有 python 2 和 3,其中 python2 是默认值)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
python2:
pip install pipreqs
python -m pipreqs.pipreqs .
检查您的 python 版本:
python --version
@Francis 说得对 -
但补充一下:
有了对 Jupyter notebooks 的额外支持——即 .ipynb
文件——你现在可以使用 https://pypi.org/project/pipreqsnb(与 pipreqs 相同的语法):
pip install pipreqsnb
pipreqs .
[我不是作者]
这个简单的任务在 Python 中如此复杂,真是令人惊叹。这是我认为自动执行此操作的最佳方法。
您需要两个工具:
1.pipreqs
pip3 install pipreqs
pipreqs 将遍历您的项目并仅安装您的项目使用的包。而不是 python 环境中的所有包,就像 pip freeze
那样。
但是这种方法有一个问题。它不安装子包。
例如,您的项目使用pandas==1.3.2
。 pandas
本身在其他软件包中使用 numpy==1.21.2
。但是pipreqs
本身并没有写requirments.txt
中的子包(即numpy)
这是您需要将 pipreqs
与第二个工具结合使用的地方。
pip3 install pip-tools
pip-tools
将获取 requirements.in
中的包并生成包含所有子包的 requirements.txt
。例如,如果你有
pandas==1.3.2
在 requirements.in
中,pip-tools
会生成
numpy==1.21.2 # via pandas
在 requirements.txt
.
但是您需要手动添加requirements.in
中的包。这很容易出错,你可能会偶尔忘记这样做。
这是您可以使用第一个工具的地方。
但是这两个工具都写入 requirements.txt
。那么如何解决呢?
使用 --savepath
代替 pipreqs
写入 requirements.in
而不是默认的 requirements.txt
.
一条命令完成;只是做
pipreqs --savepath=requirements.in & pip-compile
给你。现在您无需担心手动维护包,并且您 requirements.txt
将拥有所有子包,因此您的构建是确定性的。
TL;DR
pip3 install pipreqs
pip3 install pip-tools
使用以下内容构建确定性 requirements.txt
pipreqs --savepath=requirements.in && pip-compile
自动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
之类的东西,您只需 运行 此命令即可生成 requirements.txt
$ ./.venv/bin/pip freeze > requirements.txt
使用 pip freeze > requirements.txt
是创建需求文件的糟糕方法!它可以作为您问题的临时解决方案,但在管理 python 项目的需求时,最好手动执行。
只需搜索“import”或“from x import”,即可获得需要安装的所有依赖项的列表(无需额外安装)。
pip freeze
的问题在于它简单地转储所有具有严格版本的已安装包,每个依赖项都有自己的依赖项,并且它们包含在转储中。
例如,你安装了 lib==1.0,它需要 sub-lib==0.5,如果你使用 pip freeze
,你会得到两者,但稍后当你希望将 lib 的版本更新到 2.0 时,很可能你会遇到冲突,因为 lib v2.0 现在使用 sub-lib v1.0 而不是你需要的 v0.5 ...这个 gets complex fast 用于多个依赖项。
我们在几个项目中遇到了这些问题,从那时起我创建了一个 automated script 来清理 pip freeze
的转储,它是安全的(注释不需要的依赖项)并且效果很好。
为了帮助解决这个问题,总是 运行 requirements.txt 只在本地包上。本地包是指仅在您的项目文件夹中的包。为此,请执行以下操作:
Pip freeze —local > requirements.txt
不是 pip freeze > requirements.txt。
注意local之前是双下划线。
但是安装 pipreqs 也有帮助。
点安装 pipreqs.
不过,完美的解决方案是拥有一个 pipfile。每当您安装新的本地包时,pipfile 都会自行更新。它还有一个类似于JavaScript中的package.json的pipfile.lock。
为此,请始终使用 pipenv 而不是 pip 安装您的软件包。
所以我们做 pipenv
有时我从 github
下载 python 源代码,但不知道如何安装所有依赖项。如果没有 requirements.txt
文件,我必须手动创建它。
问题是:
给定 python 源代码目录是否可以从导入部分自动创建 requirements.txt
?
您可以使用以下代码生成requirements.txt文件:
pip install pipreqs
pipreqs /path/to/project
可以找到更多与 pipreqs 相关的信息 here。
有时您会遇到 pip freeze
,但这会保存环境中的所有包,包括那些您在当前项目中不使用的包。
建议使用 Pipenv 或其他工具来改进您的开发流程。
pip3 freeze > requirements.txt # Python3
pip freeze > requirements.txt # Python2
如果您不使用虚拟环境,pigar将是您不错的选择。
在我的例子中,我使用的是 Anaconda,所以 运行 我环境中 conda 终端的以下命令解决了它,并自动为我创建了这个 requirements.txt
文件:
conda list -e > requirements.txt
这是从这个 Github link pratos/condaenv.txt
如果出现错误,并且您正在使用 anaconda,请尝试使用 .yml
选项:
conda env export > <environment-name>.yml
供其他人使用该环境,或者如果您要在另一台机器上创建新环境:
conda env create -f <environment-name>.yml
确保 运行 pip3 for python3.7.
pip3 freeze >> yourfile.txt
在执行上述命令之前,请确保您已经创建了一个虚拟环境。
python3:
pip3 install virtualenv
python3 -m venv <myenvname>
python2:
pip install virtualenv
virtualenv <myenvname>
之后将您的源代码放入目录中。如果您现在 运行 python 文件,如果您使用非本机模块,它可能不会启动。您可以通过 运行ning pip3 install <module>
或 pip install <module>
.
除了你所在的环境,这不会影响你的整个模块列表。
现在你可以执行顶部的命令,现在你有一个需求文件,其中只包含你在虚拟环境中安装的模块。现在您可以运行顶部的命令。
我建议每个人都使用环境,因为它可以让事情变得更容易。
如果面临与我相同的问题,即 不在虚拟环境中 并且想要 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))
P.S:它在检查模糊逻辑时可能有一些额外的库。
Python3 的最佳方法是:
pip3 freeze > requirements.txt
对我有用...
不是一个完整的解决方案,但可能有助于在 Linux 上编制一份候选名单。
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > 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 冻结 > 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)
我创建了这个 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;
如果你只想列出在 virtualenv 中使用的包,请使用:
pip freeze -l > requirements.txt
如果您的系统中安装了很多依赖项,并且您需要requirements.txt用于特定项目,您可以先安装pipreqs:
$ pip install pipreqs
并在项目文件夹下执行以下命令
$ pipreqs
此命令将为特定项目生成 requirements.txt 文件。
简单的 Pythonic 方式
要在标准 requirements.txt
文件中获取所有 REQUIREMENTS 的列表,您可以使用以下命令。
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
要创建需求 Python 模块列表,请在您的终端中编写此代码:
pip3 freeze > requirements.txt
对于 python3:(我的机器上有 python 2 和 3,其中 python2 是默认值)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
python2:
pip install pipreqs
python -m pipreqs.pipreqs .
检查您的 python 版本:
python --version
@Francis 说得对 -
但补充一下:
有了对 Jupyter notebooks 的额外支持——即 .ipynb
文件——你现在可以使用 https://pypi.org/project/pipreqsnb(与 pipreqs 相同的语法):
pip install pipreqsnb
pipreqs .
[我不是作者]
这个简单的任务在 Python 中如此复杂,真是令人惊叹。这是我认为自动执行此操作的最佳方法。
您需要两个工具:
1.pipreqs
pip3 install pipreqs
pipreqs 将遍历您的项目并仅安装您的项目使用的包。而不是 python 环境中的所有包,就像 pip freeze
那样。
但是这种方法有一个问题。它不安装子包。
例如,您的项目使用pandas==1.3.2
。 pandas
本身在其他软件包中使用 numpy==1.21.2
。但是pipreqs
本身并没有写requirments.txt
这是您需要将 pipreqs
与第二个工具结合使用的地方。
pip3 install pip-tools
pip-tools
将获取 requirements.in
中的包并生成包含所有子包的 requirements.txt
。例如,如果你有
pandas==1.3.2
在 requirements.in
中,pip-tools
会生成
numpy==1.21.2 # via pandas
在 requirements.txt
.
但是您需要手动添加requirements.in
中的包。这很容易出错,你可能会偶尔忘记这样做。
这是您可以使用第一个工具的地方。
但是这两个工具都写入 requirements.txt
。那么如何解决呢?
使用 --savepath
代替 pipreqs
写入 requirements.in
而不是默认的 requirements.txt
.
一条命令完成;只是做
pipreqs --savepath=requirements.in & pip-compile
给你。现在您无需担心手动维护包,并且您 requirements.txt
将拥有所有子包,因此您的构建是确定性的。
TL;DR
pip3 install pipreqs
pip3 install pip-tools
使用以下内容构建确定性 requirements.txt
pipreqs --savepath=requirements.in && pip-compile
自动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
之类的东西,您只需 运行 此命令即可生成 requirements.txt
$ ./.venv/bin/pip freeze > requirements.txt
使用 pip freeze > requirements.txt
是创建需求文件的糟糕方法!它可以作为您问题的临时解决方案,但在管理 python 项目的需求时,最好手动执行。
只需搜索“import”或“from x import”,即可获得需要安装的所有依赖项的列表(无需额外安装)。
pip freeze
的问题在于它简单地转储所有具有严格版本的已安装包,每个依赖项都有自己的依赖项,并且它们包含在转储中。
例如,你安装了 lib==1.0,它需要 sub-lib==0.5,如果你使用 pip freeze
,你会得到两者,但稍后当你希望将 lib 的版本更新到 2.0 时,很可能你会遇到冲突,因为 lib v2.0 现在使用 sub-lib v1.0 而不是你需要的 v0.5 ...这个 gets complex fast 用于多个依赖项。
我们在几个项目中遇到了这些问题,从那时起我创建了一个 automated script 来清理 pip freeze
的转储,它是安全的(注释不需要的依赖项)并且效果很好。
为了帮助解决这个问题,总是 运行 requirements.txt 只在本地包上。本地包是指仅在您的项目文件夹中的包。为此,请执行以下操作: Pip freeze —local > requirements.txt
不是 pip freeze > requirements.txt。 注意local之前是双下划线。
但是安装 pipreqs 也有帮助。 点安装 pipreqs.
不过,完美的解决方案是拥有一个 pipfile。每当您安装新的本地包时,pipfile 都会自行更新。它还有一个类似于JavaScript中的package.json的pipfile.lock。 为此,请始终使用 pipenv 而不是 pip 安装您的软件包。 所以我们做 pipenv