How to download a distribution, possibly sdist, without potentially executing a setup.py
file (that may contain malicious code)?
I don't want to recursively get the dependencies, only download one file for the specified distribution. Attempt that doesn't work:
pip download --no-deps mydist
Here is a reproducible example that demonstrates the setup.py
is still executed in the above case:
$ 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.
I cannot use --no-binary
option, because I don't want to exclude source distributions. I just want to avoid executing their source code.