有时我从github下载python源代码,不知道如何安装所有的依赖项。如果没有requirements.txt文件,我必须手工创建它。 问题是: 给定python源代码目录,是否有可能从导入部分自动创建requirements.txt ?
当前回答
@Francis说得对- https://stackoverflow.com/a/65728461/1021819
但我要补充一点:
对Jupyter笔记本的额外支持-即.ipynb文件-您现在可以使用https://pypi.org/project/pipreqsnb(与pipreqs相同的语法):
pip install pipreqsnb
pipreqsnb .
[我不是作家]
其他回答
我创建了这个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;
确保为python3.7运行pip3。
pip3 freeze >> yourfile.txt
在执行上述命令之前,请确保您已经创建了一个虚拟环境。
python3:
pip3 install virtualenv
python3 -m venv <myenvname>
python2:
pip install virtualenv
virtualenv <myenvname>
然后将源代码放入该目录。如果你现在运行python文件,如果你使用的是非本地模块,它可能不会启动。您可以通过运行pip3 install <module>或pip install <module>来安装这些模块。
除了您所处的环境外,这不会影响整个模块列表。
现在您可以执行顶部的命令,现在您就有了一个需求文件,其中只包含您在虚拟环境中安装的模块。现在可以在顶部运行命令。
我建议每个人都使用环境,因为当涉及到这样的事情时,它会让事情变得更容易。
这个简单的任务在Python中如此复杂,真是令人惊叹。下面是我认为最好的自动完成的方法。
你需要两个工具:
1. pipreqs
Pip3安装pipreqs
Pipreqs会检查你的项目,只安装项目使用的包。而不是像pip freeze那样在python环境中执行所有包。
但这种方法有一个问题。它不安装子包。
例如,您的项目使用pandas==1.3.2。Pandas本身在其他包中使用numpy==1.21.2。但是pipreqs本身并不在requirements .txt中编写子包(即numpy)
这就是您需要将pipreqs与第二个工具结合使用的地方。
pip-tools
Pip3安装pip-tools
Pip-tools将接受需求中的包。并生成带有所有子包的requirements.txt。例如,如果你有 Pandas ==1.3.2的需求。在,pip-tools将生成
Numpy ==1.21.2 # via pandas in requirements.txt。
但是您需要手动在requirements.in中添加包。这很容易出错,你可能会偶尔忘记这样做。
在这里可以使用第一个工具。
但是这两个工具都是根据requirements.txt编写的。那么如何解决这个问题呢?
使用pipreqs的——savepath来写入需求。,而不是默认的requirements.txt。
一次命令就完成;只做
pipreqs——savepath =需求。在&& pip-compile
好了。现在您不需要担心手动维护包,并且您的requirements.txt将包含所有子包,因此您的构建是确定的。
博士TL;
Pip3安装pipreqs Pip3安装pip-tools
使用下面的代码构建确定性的requirements.txt
pipreqs——savepath =需求。在&& pip-compile
Pipenv用户可以从项目的Pipfile中生成require .txt文件:
pipenv lock --requirements
使用pip freeze > requirements.txt创建需求文件是一种糟糕的方式!它可以作为你的问题的临时解决方案,但当管理python项目的需求时,最好手动完成。
简单地搜索“import”或“from x import”,就会给出需要安装的所有依赖项的列表(没有其他内容)。
pip冻结的问题是,它只是简单地转储所有安装的严格版本的包,每个依赖项都有自己的依赖项,它们都包含在转储中。 例如,你已经安装了lib==1.0,这需要sub-lib==0.5,如果你使用pip freeze,你会得到两者,但后来当你希望将lib版本更新到2.0时,很可能你会得到冲突,因为lib v2.0现在使用sub-lib v1.0,而不是你需要的v0.5…对于多个依赖项,这很快就变得复杂起来。
我们在几个项目中遇到了这些问题,从那时起,我创建了一个自动脚本来清理pip freeze的转储,它是安全的(注释不需要的依赖项),工作很棒。