1

在一台服务器上,我可以导入库,而在第二台服务器上,我不能。我需要导入的库是通过 NFS 共享的,并且两台服务器都可以访问。

我发现两台服务器之间的 Python 路径不同,但 Python 二进制文件是相同的,从标准 ubuntu 16.04 存储库安装,并且$PYTHONPATH在两台服务器上都未设置。

服务器 1:

$ echo $PYTHONPATH

$ python
>>> import sys; sys.path
['', '/usr/lib/python2.7', '...', '/usr/local/lib/python2.7/dist-packages', '/home/user/app/src/python', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

服务器 2:

$ echo $PYTHONPATH

$ python
>>> import sys; sys.path
['', '/usr/lib/python2.7', '...', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

我如何理解这个库在哪里定义,以便将相同的行为复制到服务器 2?

奇怪的事实是库被放置在路径/usr/local/lib/usr/lib.

编辑:python 二进制文件是相同的(相同的版本 2.7.12,并且校验和匹配)并且它是从标准位置的 ubuntu 存储库安装的/usr/bin/python
我玩过这个库site,所有变量都是相同的(site.ENABLE_USER_SITE返回 True)。
我知道我可以操纵脚本中的路径,或者PYTHONPATH在 /etc/profile.d/ 中为所有服务器指定路径,但我想知道区别在哪里。

4

2 回答 2

0

Sys 模块文档说sys.path

指定模块搜索路径的字符串列表。从环境变量 PYTHONPATH 初始化,加上依赖于安装的默认值

请参阅:https ://docs.python.org/3/library/sys.html

所以必须有不同的安装依赖 default。检查确切的 python 版本。也许 python 模块二进制文件来自不同的 apt 存储库。也许python命令来自两个服务器中的不同位置 - 通过以下方式检查:

which python

还要检查站点模块- 它似乎控制着额外的路径。请参阅:http ://docs.python.org/3/library/site.html

我会导入它并检查 site.ENABLE_USER_SITE 也许它会给你一些关于差异在哪里的线索

于 2020-02-21T12:17:41.263 回答
0

我发现 Python 中存在路径配置文件。来自Python 3 上的站点模块的文档:

它首先从头部和尾部构建最多四个目录。对于头部,它使用 sys.prefix 和 sys.exec_prefix;空头被跳过。对于尾部,它使用空字符串,然后使用 lib/site-packages(在 Windows 上)或 lib/pythonX.Y/site-packages(在 Unix 和 Macintosh 上)。对于每个不同的头尾组合,它会查看它是否引用了现有目录,如果是,则将其添加到 sys.path 并检查新添加的配置文件路径。
...
路径配置文件是名称格式为 name.pth 且存在于上述四个目录之一中的文件;它的内容是要添加到 sys.path 的附加项目(每行一个)。不存在的项目永远不会添加到 sys.path,并且不会检查项目是否引用了目录而不是文件。没有项目被多次添加到 sys.path。空白行和以 # 开头的行将被跳过。执行以 import 开头的行(后跟空格或制表符)。

就我而言,/usr/local/lib/python2.7/dist-packages/easy-install.pth第二台服务器上缺少一个文件。

在调试时禁用这些文件的自动导入python -S可能会很有用。

不幸的是,我还没有找到一种方法来检索从中读取路径配置文件的目录列表。

于 2020-03-23T15:42:30.507 回答