有时我从github下载python源代码,不知道如何安装所有的依赖项。如果没有requirements.txt文件,我必须手工创建它。 问题是: 给定python源代码目录,是否有可能从导入部分自动创建requirements.txt ?
当前回答
如果遇到和我一样的问题,即不在虚拟环境中,并且想要特定项目的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))
附注:它可能有一些额外的库,因为它检查模糊逻辑。
其他回答
首先,你的项目文件必须是一个py文件,这是直接的python文件。如果你的文件是ipynb格式,你可以使用下面的代码行将它转换为py类型:
jupyter nbconvert --to=python
然后,您需要从cmd (mac终端)安装pipreqs库。
pip install pipreqs
现在我们可以使用下面的代码创建txt文件。如果你和你的文件在同一路径,你可以写。/。否则,你需要给你的文件路径。
pipreqs ./
or
pipreqs /home/project/location
这将为您的项目创建一个requirements.txt文件。
Pipenv用户可以从项目的Pipfile中生成require .txt文件:
pipenv lock --requirements
这不是一个完整的解决方案,但可能有助于在Linux上编译一个候选列表。
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > 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)
你可以使用下面的代码来生成一个requirements.txt文件:
pip install pipreqs
pipreqs /path/to/project
更多有关pipreqs的信息可以在这里找到。
有时您会遇到pip冻结,但这会保存环境中的所有包,包括那些您在当前项目中不使用的包。