How to get virtualenv to use dist-packages on Ubuntu?

后端 未结 5 1893
一向
一向 2020-12-13 20:06

I know that virtualenv, if not passed the --no-site-packages argument when creating a new virtual environment, will link the packages in /usr/local/lib/py

相关标签:
5条回答
  • 2020-12-13 20:43

    I'm just getting my head around virtualenv, but there seems to be an easier way than mentioned so far.

    1. Since virtualenv 1.7 --no-site-packages has been the default behavior. Therefore using the --system-site-packages flag to virtualenv is all that is needed to get dist-packages in your path - if you use the tweaked virtualenv shipped by Ubuntu. (This answer and this one give some useful history). I've tested this and it does work.

      $ virtualenv --system-site-packages .

    2. I agree with Thomas here - I can't see any action required in virtualenv to see the effect of updates in dist-packages.

    3. Having tested that with python setup.py install, it does (again as Thomas said) still go to dist-packages. You could change that by building your own python, but that's a bit extreme.

    0 讨论(0)
  • 2020-12-13 20:43

    PYTHONPATH works for me.

    vim ~/.bashrc
    

    add this line below:

    export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
    source ~/.bashrc
    
    0 讨论(0)
  • 2020-12-13 20:49

    What you want to achieve here is essentially add specific folder (dist-packages) to Python search path. You have a number of options for this:

    1. Use path configuration (.pth) file, entries will be appended to the system path.
    2. Modify PYTHONPATH (entries from it go to the beginning of system path).
    3. Modify sys.path directly from your Python script, i.e. append required folders to it.

    I think that for this particular case (enable global dist-packages folder) third option is better, because with first option you have to create .pth file for every virtualenv you'll be working in (with some external shell script?). It's easy to forget it when you distribute your package. Second option requires run-time setup (add a envvar), which is, again, easy to miss.

    And only third option doesn't require any prerequisites at configure- or run-time and can be distributed without issues (on the same-type system, of course).

    You can use function like this:

    def enable_global_distpackages():
        import sys
        sys.path.append('/usr/lib/python2.7/dist-packages')
        sys.path.append('/usr/local/lib/python2.7/dist-packages')
    

    And then in __init__.py file of your package:

    enable_global_distpackages()
    
    0 讨论(0)
  • 2020-12-13 20:54

    This might be a legitimate use of PYTHONPATH - an environmental variable that virtualenv doesn't touch, which uses the same syntax as the environmental variable PATH, in bash PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages in a .bashrc or similar. If you followed this path,

    1. You don't have to tell your virtual environment about this at all, it won't try to change it.

    2. No relinking will be required, and

    3. That will still go wherever it would have gone (pip install always uses /usr/local/lib/python2.7/dist-packages/ for my Ubuntu) if you install them outside of your virtual environment. If you install them from within your virtual environment (while it's activated) then of course it'll be put in the virtualenvironment.

    0 讨论(0)
  • 2020-12-13 21:06

    In the directory site-packages, create a file dist.pth In the file dist.path, put the following: ../dist-packages

    Now deactivate and activate your virtualenv. You should be set.

    0 讨论(0)
提交回复
热议问题