gpt4 book ai didi

python - pip 下载而不执行 setup.py

转载 作者:行者123 更新时间:2023-12-04 11:11:47 25 4
gpt4 key购买 nike

如何下载发行版,可能是 sdist,而不可能执行 setup.py文件(可能包含恶意代码)?

我不想递归获取依赖项,只为指定的发行版下载一个文件。尝试不起作用:

pip download --no-deps mydist

这是一个可重现的示例,演示了 setup.py在上述情况下仍然执行:

$ docker run --rm -it python:3.8-alpine sh
/ # pip --version
pip 20.0.2 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
/ # pip download --no-deps suds
Collecting suds
Downloading suds-0.4.tar.gz (104 kB)
|████████████████████████████████| 104 kB 13.4 MB/s
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-download-yqfdz35d/suds/setup.py'"'"'; __file__='"'"'/tmp/pip-download-yqfdz35d/suds/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-download-yqfdz35d/suds/pip-egg-info
cwd: /tmp/pip-download-yqfdz35d/suds/
Complete output (7 lines):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-download-yqfdz35d/suds/setup.py", line 20, in <module>
import suds
File "/tmp/pip-download-yqfdz35d/suds/suds/__init__.py", line 154, in <module>
import client
ModuleNotFoundError: No module named 'client'
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

我无法使用 --no-binary选项,因为我不想排除源分发。我只是想避免执行他们的源代码。

最佳答案

我一直在挖掘 pip ,遗憾的是那里的代码非常复杂。似乎目前没有办法做到这一 pip ,根据link provided by @doctaphred没有在这方面取得进展的计划。

下一步取决于您的情况;例如,如果您需要这个“包下载器”进行生产,我建议您编写自己的 pypi 客户端。编写起来会非常简单,而且您可以使它比 pip 更快、更简单。通过优化它以满足您的需求。为此,您可以尝试使用 pip 中的一些现有代码。 ,但我认为这可能会非常困难(在看到该代码之后)。

否则,我会考虑更快、更黑客的方法来完成工作。想到的第一个解决方案就是停止 pip每当它尝试运行 egg_info命令。为此,您可以修补 pip的代码在运行时使用各种方法。我最喜欢的是使用 usercutomize文件。

例如,创建一个包含以下内容的补丁文件并将其放置在您选择的目录中:
/pypatches/pip_pure_download/usercustomize.py :

from pip._internal.req.req_install import InstallRequirement

print('Applying pure download patch!')

def override_run_egg_info(*args, **kwargs):
raise KeyboardInterrupt # Joke's on you, evil hackers! :P

InstallRequirement.run_egg_info = override_run_egg_info

现在要将补丁应用到 python 执行,只需将补丁的目录添加到 PYTHONPATH , 例如:
PYTHONPATH=/pypatches/pip_pure_download:$PYTHONPATH pip download --no-deps suds

关于python - pip 下载而不执行 setup.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52486985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com