azm*_*euk 14 python ubuntu ubuntu-server pythonpath ubuntu-14.04
我有两台运行Ubuntu 14.04服务器的计算机(我们称之为A和B).B最初是10.04但它已经收到两次升级到12.04和14.04.我不明白为什么两台计算机上的python路径不同.
正如你可以在下面的两个路径看,画中画安装路径/usr/local/lib/python2.7/dist-packages来之前的APT Python包路径/usr/lib/python2.7/dist-packages在Ubuntu A,但说到后在Ubuntu B.
如果通过apt和pip安装了python包,这会导致一些问题.如下所示,如果安装了python-sixapt package和sixpip包,它们可能是两个不同的库版本.
软件包系统的安装并不总是我的选择,但可能是安装的其他软件包的某些依赖项.
这个问题可能可以通过virtualenv来解决,但由于我没有详细说明的原因,我不能在这里使用virtualenv,并且必须在系统范围内安装pip包.
>>> import sys, six
>>> sys.path
['',
'/usr/local/bin',
'/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/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/local/lib/python2.7/dist-packages/IPython/extensions']
>>> six
<module 'six' from '/usr/local/lib/python2.7/dist-packages/six.pyc'>
Run Code Online (Sandbox Code Playgroud)
>>> import sys, six
>>> sys.path
['',
'/usr/local/bin',
'/usr/lib/python2.7/dist-packages',
'/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/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/local/lib/python2.7/dist-packages/IPython/extensions']
>>> six
>>> <module 'six' from '/usr/lib/python2.7/dist-packages/six.pyc'>
Run Code Online (Sandbox Code Playgroud)
两台机器$PATH都是一样的,而且$PYTHONPATH是空的.
为什么那些PYTHONPATHS有所不同?
如何在"Ubuntu B"中修复pythonpath顺序,以便在系统范围内以系统方式加载pip包?是否有一个apt软件包我应该重新安装或重新配置,以便PYTHONPATH优先考虑pip包?
由于我们无法探索您的系统,我试图通过说明如何sys.path初始化来分析您的第一个问题.可用的引用是where- do- sys-path-starts和pyco-reverse-engineering(python2.6).
将sys.path来自于以下几个变量(按顺序):
$PYTHONPATH (最高优先级)sys.prefix-ed stdlibsys.exec_prefix-ed stdlibsite-packages*.pth 在站点包中(最低优先级)现在让我们描述每个变量:
$PYTHONPATH,这只是一个系统环境变量.sys.prefix并sys.exec_prefix在执行任何python脚本之前确定.它实际上是在源Module/getpath.c中编码的.逻辑是这样的:
IF $PYTHONHOME IS set:
RETURN sys.prefix AND sys.exec_prefix as $PYTHONHOME
ELSE:
current_dir = directory of python executable;
DO:
current_dir = parent(current_dir)
IF FILE 'lib/pythonX.Y/os.py' EXSITS:
sys.prefix = current_dir
IF FILE 'lib/pythonX.Y/lib-dynload' EXSITS:
sys.exec_prefix = current_dir
IF current_dir IS '/':
BREAK
WHILE(TRUE)
IF sys.prefix IS NOT SET:
sys.prefix = BUILD_PREFIX
IF sys.exec_prefix IS NOT SET:
sys.exec_prefix = BUILD_PREFIX
Run Code Online (Sandbox Code Playgroud)
&5. site-packages并*.pth通过导入添加site.py.在本单元中,您将找到以下文档:
这会将特定于站点的路径附加到模块搜索路径.在Unix(包括Mac OSX)上,它以sys.prefix和sys.exec_prefix(如果不同)开头,并附加lib/python/site-packages以及lib/site-python.......
对于Debian和衍生产品,此sys.path增加了分发中分发的包的目录.本地插件进入/ usr/local/lib/python/dist-packages,Debian插件安装到/ usr/{lib,share}/python/dist-packages./ usr/lib/python/site-packages未使用.
路径配置文件是名称格式为.pth的文件; 其内容是要添加到sys.path的其他目录(每行一个).......
以及重要功能的代码片段getsitepackages:
sitepackages.append(os.path.join(prefix, "local/lib",
"python" + sys.version[:3],
"dist-packages"))
sitepackages.append(os.path.join(prefix, "lib",
"python" + sys.version[:3],
"dist-packages"))
Run Code Online (Sandbox Code Playgroud)
现在我试着弄清楚这个奇怪的问题可能来自哪里:
$PYTHONPATH,不可能,因为A和B都是空的sys.prefix并且sys.exec_prefix,也许,请检查它们以及$PYTHONHOMEsite.py,也许,检查文件.sys.pathB 的输出很奇怪,dist-package(site-package)在sys.exec_prefix(lib-dynload)之前.请尝试调查sys.path机器B初始化的每一步,你可能会发现一些东西.
很抱歉,我无法复制您的问题.顺便说一句,关于你的问题标题,我认为SYS.PATH比PYTHONPATH这更好,这让我误解为$PYTHONPATH乍一看.
Ric*_*lev -2
PYTHONPATH 是环境变量,您可以根据需要设置它,以添加其他目录。您不应该手动安装 Python 软件包,请使用 。pip在较旧的 Ubuntu 上,可能您在升级之前已经手动安装了模块。
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |