我正在寻找一种方法来使用pip或类似方法将python包列表安装到自定义目标目录(例如/mathath/python/pkgs/),但也排除/ blacklist 特定依赖项。
我想排除特定的依赖项,因为它们已经从不同的安装路径(例如anaconda安装)得到满足。我没有权利将软件包添加到默认的python安装中(我也不想)。
我目前使用pip的-r和-t选项。但是还没有找到排除特定包的方法。
像这样的pip命令是理想的:
pip install --log pip.log -r req.txt -t /mypath/pypkgs/ --exclude exclude.txt
--no-deps
不是一个选项,因为我需要一些依赖项。
我目前正在寻找一个python脚本来执行pip安装,其中包含我不需要的依赖项:
pip install --log pip.log -r req.txt -t /mypath/python/pkgs/
然后(自动)在pip安装完成后删除不需要的依赖项。
我希望pip命令的某些组合可以实现我正在寻找一些直截了当的东西。我使用的是pip 7.1.2。谢谢!
类似,但我没有升级,并且想要指定目标路径:
pip: upgrade package without upgrading particular dependency
答案 0 :(得分:9)
面对类似的问题,并使用正在运行的bash shell我设法用
排除特定的包pip install $(grep -ivE "pkg1|pkg2|pkg3" requirements.txt)
其中pkg1
等等是要排除的软件包的名称。
答案 1 :(得分:5)
我认为这基本上可以通过几个步骤来实现,假设您正在使用virtualenv或类似的......
如果您首先执行正常pip freeze > requirements.txt
,则会获得所有传递依赖项(例如,不排除任何内容)。
现在编辑requirements.txt,删除要排除的包...
最后,在新环境中pip install -r requirements.txt -t ... --no-deps
。 Voila:你已经安装了你想要的依赖项,同时排除了特定的依赖项。
答案 2 :(得分:1)
一种考虑子依赖性的方法是先安装exclude.txt环境,然后再安装req.txt环境,然后检查diff,最后将其安装到目标目录中。
使用在GNU / Linux上可以使用的virtualenv的示例:
virtualenv tmpenv
source tmpenv/bin/activate
pip install -r exclude.txt
pip freeze > exclude-with-deps.txt
pip install -r req.txt
pip freeze > req-with-deps.txt
comm -13 exclude-with-deps.txt req-with-deps.txt > final-req.txt
pip install -r final-req.txt --no-deps -t pypkgs
答案 3 :(得分:0)
您可以使用 pip install --no-deps
和 pip check
来排除特定的包。
我的一个真实例子是,当我在 Jetson Nano 上安装 paddleocr
时,pip
一直为我安装 python-opencv
,我自己已经安装了 pip
,但是 {{ 1}} 无法检测到它。要停止 pip
为我安装 pip
,步骤如下
python-opencv
安装 pip install --no-deps paddleocr
而没有其依赖项paddleocr
列出未解析的依赖项,重新格式化输出以便 pip check
可以读取它,然后删除您不想安装的包(它在 pip install -r
我的情况),并将其保存到名为 python-opencv
fix-deps.txt
安装未解析的依赖项pip install --no-deps -r fix-deps.txt
的输出仅包含您不想安装的软件包。pip check
和 pip install --no-deps
是非常有用的命令,它们允许您在 pip check
无法为您解决问题时自行解决依赖关系。这个方案的缺点是pip
的输出是为人类设计的,它不能直接被pip check
使用,所以你必须手动重新格式化输出或使用pip install -r
命令。< /p>
已经为 pip 社区创建了 PR 和 issue,使 awk
的输出适合 pip check
阅读,但出于某种原因,他们认为这不是一个好主意。所以我想这是我们现在能做的最好的事情了。
参考: