【问题标题】:python and bpython using different PYTHONPATHs in Virtualenvpython 和 bpython 在 Virtualenv 中使用不同的 PYTHONPATH
【发布时间】:2012-06-23 19:33:20
【问题描述】:

我设置的任何虚拟环境的 sys.path 都发生了一些奇怪和意想不到的事情。例如,一个干净的环境:

$ virtualenv test
$ source test/bin/activate
(test) $

这是预期的 PYTHONPATH:

(test) $ python
>>> import sys
>>> print '\n'.join(sys.path)

/home/user/test/local/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
/home/user/test/local/lib/python2.7/site-packages/pip-1.1-py2.7.egg
/home/user/test/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
/home/user/test/lib/python2.7/site-packages/pip-1.1-py2.7.egg
/home/user/test/lib/python2.7
/home/user/test/lib/python2.7/plat-linux2
/home/user/test/lib/python2.7/lib-tk
/home/user/test/lib/python2.7/lib-old
/home/user/test/lib/python2.7/lib-dynload
/usr/lib/python2.7
/usr/lib/python2.7/plat-linux2
/usr/lib/python2.7/lib-tk
/home/user/test/local/lib/python2.7/site-packages
/home/user/test/lib/python2.7/site-packages

但这是我真正得到的:

(test) $ bpython
>>> import sys
>>> print '\n'.join(sys.path)

/usr/bin
/usr/lib/python2.7
/usr/lib/python2.7/plat-linux2
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages

我无法弄清楚这两个不同 sys.path 的原因。 因此,没有 pip 安装工作! 我正在使用 Virtualenv 1.7.2、Ubuntu 12.04、Python 2.7.3。 任何帮助将不胜感激。

【问题讨论】:

    标签: virtualenv pythonpath


    【解决方案1】:

    我没有为每个 virtualenv 安装一个 bpython 副本,而是将此函数添加到我的 shell 配置文件中(例如 ~/.bashrc~/.zshrc)。它用一些逻辑包装了 bpython 命令以加载虚拟环境的 python 路径(如果你有一个活动的虚拟环境)。

    bpython() {
        if test -n "$VIRTUAL_ENV"
        then
            PYTHONPATH="$(python -c 'import sys; print ":".join(sys.path)')" \
            command bpython "$@"
        else
            command bpython "$@"
        fi
    }
    

    【讨论】:

    • +1。当--no-site-packages 解决方案不起作用时,此解决方案对我有用。
    • 我不喜欢这种方法,但我真的认为这是最好的选择。
    【解决方案2】:

    我发现我需要在安装 bpython 后停用并重新激活我的 virtualenv 才能正常工作。

    1. pip install bpython
    2. deactivate
    3. . bin/activate # 或您的等效激活命令

    【讨论】:

      【解决方案3】:

      我的假设是你在激活新的 virtualenv 后没有安装 bpython。

      我跟你说的完全一样:

      mkvirtualenv bpython
      (bpython)~ $ pip install bpython
      (bpython)~ $bpython
      

      然后运行命令:

      >>> import sys
      >>> print '\n'.join(sys.path)
      
      /Users/xxxx/.virtualenvs/bpython/bin
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages/pip-1.1-py2.7.egg
      /Users/xxxx/.virtualenvs/bpython/lib/python27.zip
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-darwin
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-mac
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-mac/lib-scriptpackages
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-tk
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-old
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-dynload
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages
      

      并通过在激活的 virtualenv 下运行 python 再次做同样的事情

      (bpython)~ $ python
      .....
      >>> import sys
      >>> print '\n'.join(sys.path)
      
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages/pip-1.1-py2.7.egg
      /Users/xxxx/.virtualenvs/bpython/lib/python27.zip
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-darwin
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-mac
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/plat-mac/lib-scriptpackages
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-tk
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-old
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/lib-dynload
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
      /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
      /Users/xxxx/.virtualenvs/bpython/lib/python2.7/site-packages
      

      我发现这两个结果没有区别

      【讨论】:

      • 你是对的。我认为 virtualenv 会更改任何其他程序的 PYTHONPATH,因为它处于活动状态。谢谢。
      【解决方案4】:

      我还发现,如果您在本地安装了 bpython,您需要使用 --no-site-packages 创建您的 virtualenv 才能使其正常工作。如果您在没有该标志的情况下创建了 virtualenv,则可以在 ~/.virtualenvs/<env-name>/lib/python2.7/ 中创建一个名为 no-global-site-packages.txt 的空文件,如 this Stack Exchange answer 中所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多