当我在 virtualenv 中使用 pip 安装软件包时,如何跟踪它们?
现在看起来很乱;如果我安装包 A,它会自动安装其依赖项; B、C 和 D。然后我决定使用包 N,它也安装了它的依赖项。
现在,当我删除包 A 时,它的依赖项不会自动删除。
如何保持我的 virtualenv 干净?有没有工具可以检查未使用的包并将其删除?
要删除包:
pip uninstall package_name
获取任何给定包所需的包列表:
pip show package_name
这将向您显示运行所需的软件包,以及运行所需的软件包。
因此,卸载一个包及其所有依赖包的最佳方法是先运行
pip show package_name
查看其依赖包列表,然后将其连同其依赖包一一卸载。例如:
pip show package_name
pip uninstall package_name
pip uninstall dependency_package_1
pip uninstall dependency_package_2
pip uninstall dependency_package_3
...
...
...
制作 virtualenvs 相对便宜。每当遇到这种情况时,您都可以创建一个新的 virtualenv 并再次运行 pip install 。
不是很优雅,但它可以完成工作。当然,您需要维护 pip 安装的一些要求文件,如果您有 pip 的本地索引或缓存,安装速度会更快。
要获得一个干净的环境,就要创造一个新的环境。一些 pip hooks 可以帮助你走上这条路:
pip freeze
获取已安装软件包及其版本的列表,稍后可以与-r <file>
安装需求文件中所述的软件包列表--build <dir>
将构建放在特定目录中--no-clean
不清理构建目录--no-download
--no-deps
不安装依赖项另一种方法是在“setup.py”或“requirements.txt”中命名项目的每个依赖项。使用 virtualenv 多次执行 setup.py 或 pip install
cat requirements.txt
才能成功运行您的应用程序。之后,手动将新的依赖项添加到其中一个文件,以保持依赖项同步。
虽然其他答案基本上是正确的,但以下是我建议使用虚拟环境完成他们建议的具体步骤(注意 Conda 不同,这仅适用于您询问的虚拟环境):
首先,确保您的requirements.txt 文件仅包含您已明确安装的软件包以及所需的版本。您可以通过“pip freeze”生成列表,但该命令将列出所有包,而不仅仅是“顶级”包,因此请务必修剪它。 requirements.txt 看起来像这样:
python-dotenv~=1.0.0
pypdf2~=3.0.1
...and so on...
其次,通过附加 -backup 来重命名现有的 venv 目录(这样万一出现问题,你可以随时将其恢复)
cd <project dir>
mv venv venv-backup
返回 PyCharm,进入“设置...”->“项目:MyProject”->“Python 解释器”。顶部的“Python Interpreter”现在将变成红色,因为它不再看到您的 venv。单击“添加解释器”->“添加本地解释器...”,然后在出现的对话框中选择 Virtualenv 环境。将其保留为“新”,该位置应该会自动填充您的旧信息。点击“确定”。
现在转到 PyCharm 中的“终端”选项卡,然后输入:
pip install -r requirements.txt
这应该将与您为“顶级”软件包指定的版本兼容的所有内容的最新版本重新安装到您的新 venv 中。它还将有助于列出requirements.txt 文件的哪一行导致安装每个附加包。
如果一切正常,您可以删除 venv-backup。 (更改名称的另一种方法是在 PyCharm 中创建第二个 venv,切换到它,然后在新的运行时删除第一个 venv。我只是不喜欢用这种方法不断旋转 venv 名称。)
我同意 PyCharm 应该更好地自动跟踪这一点,但在那之前,我希望这会有所帮助。