没有PYTHONPATH时PYTHONPATH是什么?

7 投票
2 回答
9766 浏览
提问于 2025-04-17 13:41

我需要在我的 PYTHONPATH 中添加一个新的目录位置,但问题是我现在在一个全新安装的系统上(Linux),还没有定义过 PYTHONPATH。我之前读过关于 PYTHONPATH 的内容,也用过它,觉得自己理解得不错,但我不知道当没有 PYTHONPATH 时会发生什么。

我不能在一个不存在的东西上添加内容,但我希望所有当前找到的重要库仍然能正常工作。为了小心起见,我在 Python 中执行了 print str(sys.path) 来获取所有标准值。然后我为 PYTHONPATH 定义了一个环境变量,包括我刚找到的所有节点,还有我的新目录。但是,哇,很多东西都停止工作了!因为新的 env 变量,Python 变得一团糟,我不得不把它删除,之后一切又正常了。因为错误的 PYTHONPATH,系统甚至连在提示符下输入错误命令时都找不到错误信息来显示。

我的问题并不是简单的像缺少冒号,或者在应该用冒号的地方用了分号;我检查过了。而且我的新目录并没有导致问题,因为即使没有这个新节点,问题仍然存在。那么,有人能解释一下为什么这种方法不行吗?

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

下面我提供了一些额外的细节,但我觉得问题已经解决了,不需要再读下去了。关于 PYTHONPATH 中列出的节点并不会覆盖所有“标准”节点,而是成为新的、额外的条目(我认为是添加在前面,这样可以控制顺序)这一解释是关键。

从头开始,定义没有 PYTHONHOMEPYTHONPATH,在 Python 中得到的结果是:

print ':'.join(sys.path)      
:/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/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/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client   

把这个当作 PYTHONPATH(也就是说,在调用 Python 之前定义一个环境变量),会导致命令提示符功能非常差,即使没有明确使用 Python。例如:

$> export PYTHONPATH='/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/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/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client'

$> echo $PYTHONPATH        
/usr/lib/python2.7:/usr/lib/python2.7/plat-linux2:/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/PIL:/usr/lib/python2.7/dist-packages/gst-0.10:/usr/lib/python2.7/dist-packages/gtk-2.0:/usr/lib/python2.7/dist-packages/ubuntu-sso-client

$> IntentionalBadCommand       
Fatal Python error: Py_Initialize: Unable to get the locale encoding    
 File "/usr/lib/python2.7/encodings/__init__.py", line 123    
raise CodecRegistryError,\    
                        ^
SyntaxError: invalid syntax       
Aborted

错误在于认为 PYTHONPATH 需要包含所有需要的东西。是的,我在发帖之前确实看过手册,但我想我错过了开头的“增强”这个词的重要性。所以我接受了建议,不需要明确指定所有内容——只需要指定想要的额外内容,我尝试了:

$> export PYTHONPATH=/usr/lib/python2.7/dist-packages/postgresql-pkg

$> echo $PYTHONPATH         
/usr/lib/python2.7/dist-packages/postgresql-pkg

$> IntentionalBadCommand       
IntentionalBadCommand: command not found

所以看起来是有效的,尽管我还没有尝试使用上面提到的 postgresql 包。不过,为什么在 PYTHONPATH 前面加上大量不必要的节点会导致这么严重的问题,还是有点神秘,尤其是因为我得到的条目来自一个应该是可靠的来源:sys.path。

但无论如何,问题可能解决了,所以谢谢!

相关问题:

2 个回答

1

在Unix系统上,路径应该是/usr/local/lib/python**,其中的**代表Python的版本,比如2.7等等。

你的问题其实和PYTHONPATH和PYTHONHOME这两个变量的定义有关。

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME

默认的搜索路径是根据安装情况而定的,但一般来说,它是从prefix/lib/pythonversion开始的(可以参考上面的PYTHONHOME)。这个路径总是会加到PYTHONPATH后面。

我建议你也试试这个

import sys    
sys.path.append('Directory you wanna add to the path')

希望这对你有帮助。

7

你的问题具体是什么还不太清楚,但要注意,你不需要把 sys.path 的默认值加到你的 PYTHONPATH 变量里。你放在 PYTHONPATH 里的目录是用来额外搜索的;系统的默认目录会自动加到你的 PYTHONPATH 后面。换句话说,大致上可以理解为:

sys.path = ":".split( os.environ['PYTHONPATH'] ) + sys.path

如果能显示出 PYTHONPATH 的具体值和出现的错误信息,会更有助于我们找出问题所在。

撰写回答