pip 下载而不执行 setup.py

wim*_*wim 16 python distutils pip setuptools pypi

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

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

pip download --no-deps mydist
Run Code Online (Sandbox Code Playgroud)

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

pip download --no-deps mydist
Run Code Online (Sandbox Code Playgroud)

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

kma*_*ork 7

我一直在研究pip,遗憾的是那里的代码非常复杂。目前似乎没有办法做到这一点,根据@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
Run Code Online (Sandbox Code Playgroud)

现在要将补丁应用于 python 执行,只需将补丁的目录添加到PYTHONPATH,例如:

PYTHONPATH=/pypatches/pip_pure_download:$PYTHONPATH pip download --no-deps suds
Run Code Online (Sandbox Code Playgroud)


doc*_*red 1

从 pip 19.3.1 开始这似乎不可能:(

请参阅https://github.com/pypa/pip/issues/1884