I am trying to install a Python (C-extension, if it matters) package that is located in a mounted directory, which for security reasons is read-only. However, by default pip will build the package in a subdirectory called build
in its own location, which I can't.
$ pip install /mnt/remote/pkgname
Processing /mnt/remote/pkgname
Preparing metadata (setup.py) ... done
Using legacy 'setup.py install' for pkgname, since package 'wheel' is not installed.
Installing collected packages: pkgname
Attempting uninstall: pkgname
Found existing installation: pkgname 1.0.0
Uninstalling pkgname-1.0.0:
Successfully uninstalled pkgname-1.0.0
Running setup.py install for pkgname ... error
ERROR: Command errored out with exit status 1:
command: /path/to/venv/bin/python3.8 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/mnt/remote/pkgname/setup.py'"'"'; __file__='"'"'/mnt/remote/pkgname/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-84ofxq5a/install-record.txt --single-version-externally-managed --compile --install-headers /path/to/venv/include/site/python3.8/pkgname
cwd: /mnt/remote/pkgname/
Complete output (6 lines):
running install
running build
running build_ext
building '_pkgname' extension
creating build
error: could not create 'build': Read-only file system
----------------------------------------
Rolling back uninstall of pkgname
Moving to /path/to/venv/lib/python3.8/site-packages/_pkgname.cpython-38-x86_64-linux-gnu.so
from /tmp/pip-uninstall-6pwxs8h_/_pkgname.cpython-38-x86_64-linux-gnu.so
Moving to /path/to/venv/lib/python3.8/site-packages/pkgname-1.0.0.egg-info
from /path/to/venv/lib/python3.8/site-packages/~lclib-1.0.0.egg-info
ERROR: Command errored out with exit status 1: /path/to/venv/bin/python3.8 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/mnt/remote/pkgname/setup.py'"'"'; __file__='"'"'/mnt/remote/pkgname/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-84ofxq5a/install-record.txt --single-version-externally-managed --compile --install-headers /path/to/venv/include/site/python3.8/pkgname Check the logs for full command output.
I've tried to use combinations of the flags -e
, --target <dir>
, --src
, but none of them changed the output.
Is there a way to compile the package without having to copy the folder locally?
Edit
I've just noticed there is a long discussion on this issue in https://github.com/pypa/pip/issues/10587.
A temporary solution is to run it with a deprecated option:
$ pip install --use-deprecated=out-of-tree-build /mnt/remote/pkgname
But this flag is set to stop working in version 22.1. I still need a long-term solution, and that issue link is probably where we'll get it.