8

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.

augustomen
  • 8,977
  • 3
  • 43
  • 63
  • It is doubtful because most compilers & linkers are going to need to have a writable file store. – martineau Oct 22 '21 at 19:46
  • Since you can install somewhere (possibly your home directory), you can create a temporary tmp directory (yes, twice temporary). E.g., `mkdir $HOME/tmp`, then set `TMPDIR` and run `pip install`: `TMPDIR=$HOME/tmp pip install /mnt/remote/pkgname` might just work. – 9769953 Oct 22 '21 at 20:19
  • Related: https://github.com/pypa/pip/issues/3930 – rudolfbyker Mar 08 '23 at 14:48

1 Answers1

0

you could use pip install -b customized_build_directory to specify another directory as build base directory, for example /tmp.

sbabti zied
  • 784
  • 5
  • 17