How to install python modules in a local directory? --user and exporting pythonpath isn't working

13,467

Solution 1

create a folder called "lib"

For Python 3

pip3 install <your_python_module_name> -t lib/

For Python 2

pip install <your_python_module_name> -t lib/

Solution 2

virtualenv is what I would recommend for this case (and pretty much any other case). I use it for pretty much everything I do in Python.

It allows you to essentially create a sandbox containing a Python environment that is bootstrapped from a Python install on your machine, and to install any modules you want into it.

It should not, in general, require the use of sudo, since you're not touching the system install. You can generally pip install a module right into the virtualenv, and then you run your scripts out of that virtualenv. You would basically just need a location you can read/write/execute from, say a directory you create in your user's home directory.

You can keep track of what's installed by doing a pip freeze > requirements and checking that into an SCM, and then a new virtualenv can be recreated using that file, ready to run your scripts.

The link I provided above has more details about how to use virtualenv.

Edit in response to comment from OP:

You can still use pip install outside of virtualenv, and I would recommend that. However, that can only operate on various Python installs that may be on the box (invoke pip from the bin directory of the install you want to use).

However, that won't work for installation into arbitrary directories. For that, you could try to unzip the egg file (they are supposed to be zip files) into the directory you want, and then make sure that directory is on the PYTHONPATH. Some egg files are available for direct download off of PyPI, although some are source only.

I think is approach is much more complex and prone to problems than virtualenv would be, though.

Solution 3

CFLAGS=-I$(brew --prefix)/include LDFLAGS=-L$(brew --prefix)/lib pip install <package>

I found that on servers where you haven't root access to, you can usually install the python module into your .brew/lib using this.

Share:
13,467
jake9115
Author by

jake9115

Updated on June 23, 2022

Comments

  • jake9115
    jake9115 almost 2 years

    I don't know very much about python but would like to install some python modules in a local directory on a server on which I don't have sudo access.

    I start by going into my desired directory (not root) and create the directory tree needed to store my custom modules

    cd /root/example/sub-example
    mkdir -p local/lib/python2.7/site-packages
    

    I then export this local path to PYTHONPATH

    export PYTHONPATH=$PYTHONPATH:/root/example/sub-example/local/lib/python2.7/site-packages
    

    I then make a new sub-directory to store the python package while extracting

    mkdir example-python-directory
    cd example-python-directory
    wget http://example-python-package
    tar -xvf example-python-package.tar.gz
    cd example-python-package
    

    Last, I run the setup.py script with the --user flag to try to get it to install in my specified /local directory

    python setup.py install --user
    

    The problem is, nothing is installed in my /root/example/sub-example/local/lib/python2.7/site-packages directory, and instead I find that I now have a new directory at root: /root/.local/lib/python2.7/site-packages

    Is there a way to prevent this? I feel like my lack of Python knowledge is causing me to make some silly error that is probably obvious to others. Thanks for the help!