为什么virtualenv从我的shell继承$ PYTHONPATH?

时间:2014-07-05 06:44:21

标签: python virtualenv pythonpath virtualenvwrapper zshrc

所以我在Ubuntu 14.04机器上将我的所有工具从python2迁移到python3.4。到目前为止,我已经完成了以下工作:

  1. 在我的zshrc中将python别名为python3,仅用于我的用户
  2. 在系统本身上安装了pip3(但是我只是使用virtualenvs来解决所有问题,所以我不会真正使用它)。
  3. 改变了我的virtualenvwrapper" make" mkvirtualenv --python=/usr/bin/python3的别名(' workon'在下面调用' v')
  4. 现在好奇,你可以清楚地看到它,从virtualenv激活的环境运行python3仍然继承我的$ PYTHONPATH,它仍然为我所有的python2路径设置。这在我的virtualenv中安装/运行程序时会造成严重破坏,因为python3路径显示在旧的python2路径之后,因此python2模块首先在我的程序中导入。把我的$ PYTHONPATH解压缩到''在启动virtualenv之前修复此问题,我的程序按预期启动。但我的问题是:

    1. virtualenvs中$ PYTHONPATH的继承是否正常?那不是打败了整个目的吗?
    2. 为什么当python已经在内部处理它自己的路径时,将$ PYTHONPATH设置为shell中的env-var?
    3. 我正确使用$ PYTHONPATH吗?我应该在我的zshrc'中设置它吗?仅列出我的个人添加内容($ HOME / dev),而不是冗余的' / usr / local / lib /'地点?
    4. 我可以很容易地在调用它们之前导出备用的python3路径以供我的virtualenvs使用,并在完成后重置它们,但这是解决此问题的最佳方法吗?
    5.     ○ echo $PYTHONPATH
          /usr/local/lib/python2.7/site-packages:/usr/local/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages:/home/brian/dev
      
          brian@zeus:~/.virtualenvs
          ○ python2
          Python 2.7.6 (default, Mar 22 2014, 22:59:56)
          [GCC 4.8.2] on linux2
          Type "help", "copyright", "credits" or "license" for more information.
          >>> import sys, pprint
          >>> pprint.pprint(sys.path)
          ['',
           '/usr/local/lib/python2.7/dist-packages/pudb-2013.3.4-py2.7.egg',
           '/usr/local/lib/python2.7/dist-packages/Pygments-1.6-py2.7.egg',
           '/usr/local/lib/python2.7/dist-packages/urwid-1.1.1-py2.7-linux-x86_64.egg',
           '/usr/local/lib/python2.7/dist-packages/pythoscope-0.4.3-py2.7.egg',
           '/usr/local/lib/python2.7/site-packages',
           '/usr/local/lib/python2.7/dist-packages',
           '/usr/lib/python2.7/dist-packages',
           '/home/brian/dev',
           '/usr/lib/python2.7',
           '/usr/lib/python2.7/plat-x86_64-linux-gnu',
           '/usr/lib/python2.7/lib-tk',
           '/usr/lib/python2.7/lib-old',
           '/usr/lib/python2.7/lib-dynload',
           '/usr/lib/python2.7/dist-packages/PILcompat',
           '/usr/lib/python2.7/dist-packages/gst-0.10',
           '/usr/lib/python2.7/dist-packages/gtk-2.0',
           '/usr/lib/pymodules/python2.7',
           '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
           '/usr/lib/python2.7/dist-packages/ubuntuone-client',
           '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol',
           '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
          >>>
      
          brian@zeus:~/.virtualenvs
          ○ v py3venv
          (py3venv)
          brian@zeus:~/.virtualenvs
          ○ python3
          Python 3.4.0 (default, Apr 11 2014, 13:05:11)
          [GCC 4.8.2] on linux
          Type "help", "copyright", "credits" or "license" for more information.
          >>> import sys, pprint
          >>> pprint.pprint(sys.path)
          ['',
           '/usr/local/lib/python2.7/site-packages',
           '/usr/local/lib/python2.7/dist-packages',
           '/usr/lib/python2.7/dist-packages',
           '/home/brian/dev',
           '/home/brian/.virtualenvs/py3venv/lib/python3.4',
           '/home/brian/.virtualenvs/py3venv/lib/python3.4/plat-x86_64-linux-gnu',
           '/home/brian/.virtualenvs/py3venv/lib/python3.4/lib-dynload',
           '/usr/lib/python3.4',
           '/usr/lib/python3.4/plat-x86_64-linux-gnu',
           '/home/brian/.virtualenvs/py3venv/lib/python3.4/site-packages']
          >>>
          (py3venv)
      

3 个答案:

答案 0 :(得分:2)

您还可以通过添加到virtualenv的/ bin / activate文件来更改Python路径:

导出PYTHONPATH =“/ your / path”

进一步解释here

引用:

要在停用时将其恢复为原始值,您可以添加

导出OLD_PYTHONPATH =“$ PYTHONPATH”

在前面提到的行之前,并将以下行添加到bin / postdeactivate脚本中。


您可能还想查看this回答,其中讨论了如何使用add2virtualenv添加目录。

答案 1 :(得分:1)

我偶然发现了this answer关于$ PYTHONPATH的问题,刚刚为我解决了这个问题。基本上,设置$ PYTHONPATH是可选的,对用户来说是方便的。它应该只包含用户想要添加到其python路径的其他路径,这样用户就不必在python本身中执行此操作只是为了从终端运行脚本。

因此,为了解决上面的问题,我将$ PYTHONPATH(在我的zshrc中)设置为仅我的'$ HOME / dev'的附加文件夹,而不是其他任何内容。这消除了我路径中对python2的引用,我的所有python3程序都按照我的virtualenv中的预期开始。

答案 2 :(得分:0)

$PYTHONPATH出现在你的virtualenv中,因为virtualenv只是你的shell环境的一部分,你(某处)告诉你的shell将PYTHONPATH的值导出到子shell。

在虚拟环境中工作的乐趣之一是,在PYTHONPATH上放置其他目录的需求要少得多,但看起来好像你已经无意中将其视为全局(对于所有shell)设置,当它更适合作为每个项目设置时。