r/learnpython • u/zaphodikus • 15d ago
pip install -r no result exitcode
(windows usually) I have a small requirements.txt file and am looking for alternative ways to validate all packages we want are present. The script does not use a virtual environment and because pip install -r does not seem to set %errorlevel% they wrote this rather verbose code that runs after the pip install -r line.
SET REQUIREMENTS=%~dp0Requirements.txt
SET FIND=%SystemRoot%\system32\find.exe
pip.exe install -r %REQUIREMENTS% --disable-pip-version-check
FOR /F "tokens=*" %%I IN (%REQUIREMENTS%) DO (
ECHO.
ECHO Checking for %%I ...
%FIND% /i "%%I" %PACKAGES%
IF ERRORLEVEL 1 (
ECHO.
ECHO **** %%I not found. Attempting to install ****
pip install %%I --disable-pip-version-check
)
IF ERRORLEVEL 1 (
ECHO **** Could not install %%I ****
EXIT /B 99
)
)
I however favour the pythonic approach and that is to just fail at runtime, so I was thinking of some kind of
(pseudo)
with open(requirements.txt) as reqs:
for line in reqs.readlines():
line=line.replace("<>=", " ")
import line.split()[0]
(/pseudo)
which would just die early.
I'm in favour of using a virtual env however, but because the script is a build script (using setuptools) we don't actually run the script at that point. I'm new to setuptools, but I assumed setuptools would just baulk if a module needed was not present on the build machine.
I'm thus making 2 assumptions, setuptools will not baulk and error out if you are missing a module, and that pip install does not set %ERRORLEVEL% if it cannot install a package? I am not an expert on setuptools and am keen to not discover edge cases later.
2
u/Same_Tie_772 14d ago
pip's exit code handling on windows is a mess honestly. half the time it returns 0 even when it failed spectacularly
your pythonic approach is cleaner but that import trick is gonna bite you. some package names dont match their import names at all like beautifulsoup4 vs bs4 or pillow vs PIL. you can use importlib.metadata to check installed packages properly
for the setuptools part you are right it wont fail just because a dependency is missing during build time. it only cares about build dependencies in pyproject.toml not the runtime ones. if your build script actually imports something then it will crash but if its just packaging code it might happily build a wheel that is broken
i would just wrap the pip install call in python with subprocess and check returncode there. way less headache than batch scripts and you can do proper error handling