为全局python 3.2和python 2.7设置不同的系统路径

时间:2016-01-12 10:36:28

标签: python python-2.7 python-3.x

我安装了一个编译源代码的模块。我使用python3.4做了这个,模块位于/usr/local/lib/python3.4/site-packages/。如果我尝试运行它,python3.4找不到它。如果我将目录添加到PYTHONPATH,一切正常。

但我有两个版本的python(我正在运行ubuntu)。 Python2.7和python3.4。将目录添加到PYTHONPATH后,它变为:

/home/myuser/development/ros/devel/lib/python2.7/dist-packages:/opt/ros/indigo/lib/python2.7/dist-packages:/home/myuser/Qt/5.5/gcc_64/lib/cmake/lib/python2.7/dist-packages:/usr/local/lib/python3.4/site-packages/:/home/myuser/development/lcm

所以在相同的环境变量中有与python2.7和python3.4相关的目录,我认为这完全是不安全和疯狂的。它很容易出错。

我一直在四处寻找,并发现人们建议使用virtualenv。然而,这并没有改变PYTHONPATH。

处理此问题的标准方法是什么?一些想法:

  • 我希望python3.4会自动在/usr/local/lib/python3.4/site-packages/中查找模块,但这种情况并没有发生。也许我的python3.4安装有什么关闭?
  • 即使我设法在没有使用PYTHONPATH的情况下将该模块用于python3.4,我仍然在PYTHONPATH中有关于python2.7的信息,即使我使用的是python3.4,所以我也应该删除它。

那么,如何设置python的路径全局查找模块(不是每个程序使用sys.path()),而是每个python版本使用它自己的路径?

编辑:从评论中,我意识到我可以添加一个符号链接到我的模块所在的目录。但我发现python 2.7或3.4都没有路径中的站点包,这是错误的..这​​是一个ubuntu问题吗?我在某处读到了site-packages应该用于自编译模块,以及用于通过apt-get安装的模块的dist-packages。

编辑2:python#。#/ site-packages保留给自定义包。至少在ubuntu中,默认情况下python不会查找。所以我所拥有的行为是正确的,安装没有错。

1 个答案:

答案 0 :(得分:2)

对于特定于用户的软件包,安装它们的最佳位置是per-user site directory。在unix系统上,默认情况下为~/.local,但可以通过设置PYTHONUSERBASE环境变量来更改它。要查看系统上的当前设置,请运行以下命令:

[user@localhost tmp]$ PYTHONPATH='' python -m site
sys.path = [
    '/tmp',
    '/usr/lib/python35.zip',
    '/usr/lib/python3.5',
    '/usr/lib/python3.5/plat-linux',
    '/usr/lib/python3.5/lib-dynload',
    '/usr/lib/python3.5/site-packages',
]
USER_BASE: '/home/user/.local' (exists)
USER_SITE: '/home/user/.local/lib/python3.5/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

请注意,最终显示在.local/lib下的目录是版本化的,从而避免了PYTHONPATH的问题。

因此,当您安装软件包时,您需要做的就是确保指定正确的python可执行文件,并将configure / setup脚本指向您的用户站点目录:

python3.5 setup.py install --prefix /home/user/.local

或者,如果您使用pip,使用--user选项可以实现同样的目标:

pip3 install --user some-package