Ubuntu 14.04上的PYTHONPATH订单

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包.

Ubuntu A.

>>> 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)

Ubuntu B

>>> 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包?

roj*_*eer 6

由于我们无法探索您的系统,我试图通过说明如何sys.path初始化来分析您的第一个问题.可用的引用是where- do- sys-path-startspyco-reverse-engineering(python2.6).

sys.path来自于以下几个变量(按顺序):

  1. $PYTHONPATH (最高优先级)
  2. sys.prefix-ed stdlib
  3. sys.exec_prefix-ed stdlib
  4. site-packages
  5. *.pth 在站点包中(最低优先级)

现在让我们描述每个变量:

  1. $PYTHONPATH,这只是一个系统环境变量.
  2. &3. sys.prefixsys.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)
  1. &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)

现在我试着弄清楚这个奇怪的问题可能来自哪里:

  1. $PYTHONPATH,不可能,因为A和B都是空的
  2. sys.prefix并且sys.exec_prefix,也许,请检查它们以及$PYTHONHOME
  3. site.py,也许,检查文件.

sys.pathB 的输出很奇怪,dist-package(site-package)在sys.exec_prefix(lib-dynload)之前.请尝试调查sys.path机器B初始化的每一步,你可能会发现一些东西.

很抱歉,我无法复制您的问题.顺便说一句,关于你的问题标题,我认为SYS.PATHPYTHONPATH这更好,这让我误解为$PYTHONPATH乍一看.


Ric*_*lev -2

PYTHONPATH 是环境变量,您可以根据需要设置它,以添加其他目录。您不应该手动安装 Python 软件包,请使用 。pip在较旧的 Ubuntu 上,可能您在升级之前已经手动安装了模块。