我安装了一个编译源代码的模块。我使用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。
处理此问题的标准方法是什么?一些想法:
那么,如何设置python的路径全局查找模块(不是每个程序使用sys.path()),而是每个python版本使用它自己的路径?
编辑:从评论中,我意识到我可以添加一个符号链接到我的模块所在的目录。但我发现python 2.7或3.4都没有路径中的站点包,这是错误的..这是一个ubuntu问题吗?我在某处读到了site-packages应该用于自编译模块,以及用于通过apt-get安装的模块的dist-packages。
编辑2:python#。#/ site-packages保留给自定义包。至少在ubuntu中,默认情况下python不会查找。所以我所拥有的行为是正确的,安装没有错。
答案 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