我安装了一个编译源代码的模块。我使用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使用该模块,即使在使用python3.4的情况下,我在PYTHONPATH中仍然具有与python2.7相关的信息,因此我也应该将其删除。


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

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

编辑2:python#。#/ site-packages保留用于自定义软件包。至少在ubuntu中,默认情况下python不会在其中查找。因此,我的行为是正确的,安装上没有任何错误。

最佳答案

对于特定于用户的软件包,安装它们的最佳位置是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

关于python - 全局为python 3.2和python 2.7设置不同的系统路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34741333/

10-15 12:53