没有PYTHONPATH时,PYTHONPATH是什么?

6
我需要将一个新的目录位置添加到我的PYTHONPATH中,但问题是我正在一台干净的、新安装的系统(Linux)上,在这里没有定义任何PYTHONPATH。我已经阅读并使用了PYTHONPATH,我认为我很了解它,但当没有PYTHONPATH时,我不知道发生了什么。
我无法附加到不存在的内容,但我希望所有重要的库仍然能够工作,因此,小心起见,我从Python中执行print str(sys.path)以获取所有标准值。然后,我为PYTHONPATH定义了一个env-变量,包括我刚才找到的所有节点和我的新目录。但哇,很多东西都停止工作了!Python混乱了,因为有了新的env-变量,我不得不删除它,此时一切都恢复正常。有了糟糕的PYTHONPATH,系统非常困惑,甚至在提示符处输入错误命令时也找不到错误消息显示。
我的问题不像缺少冒号或者应该使用分号而使用冒号这样简单;我检查过了。而且我的新目录也不会引起问题,因为即使没有新节点,问题仍然存在。那么有人能解释一下为什么这种方法不起作用吗?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
如下提供额外的细节,但不需要读得太深入,我认为问题已经解决了。列表中列出的节点并不会覆盖所有“标准”节点,而是成为新的附加条目(我相信是预先设置的,所以可以控制哪个先出现)是关键。
从头开始,不定义任何PYTHONHOME或PYTHONPATH,在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
以后参考,你可以只写 --- 而不是一行 % 字符,它会自动插入一个带有间距的水平线。 - abarnert
2个回答

7

不清楚你的问题是什么,但请注意不需要将sys.path的默认值添加到PYTHONPATH变量中。您放入PYTHONPATH中的目录是要额外搜索的目录;系统默认会将其附加到PYTHONPATH。换句话说,大致上:

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

展示PYTHONPATH的确切值以及导致的错误将有助于我们确定问题。


换句话说,PYTHONPATH 是可选的。在大多数情况下,您不需要定义它。因此,新的 Linux 安装也没有它。 - Keith
请查看问题中新增的部分,该部分位于百分号字符串之后(注释空间有限)。非常感谢您的帮助。 - Will Zimmerman
+1 @Andrew 的源链接非常有帮助,尤其是当文档不够清晰时。 - abarnert

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

希望这有所帮助。

1
在哪些Unix系统中可以找到/usr/local/PythonXY?在大多数Unix和类Unix系统中,包括Linux,在/usr/local/lib/pythonX.Y或有时是/usr/lib/pythonX.Y/some/other/prefix/lib/pythonX.Y中可以找到它 - 但它总是在lib下,小写的p,版本号之间有一个点。我唯一能想到的常见例外是OS X,其中有一个框架构建,它类似于/Library/PythonX.Y/Library/Frameworks/Python.framework/Versions/X.Y/lib/pythonX.Y - abarnert
谢谢你立刻对我的回答进行了负面评价,而没有给我改正的机会。你又赚了一分。你是对的。我已经纠正了错别字......我的回答的真正要点在于我引导他去的官方页面上。安装路径是可配置的,而不是写死的。 - Guddu
2
你知道如果你修正了答案,踩的票数是可以被撤销的吗?同时,请记住,投票是关于答案有多有用,而不是其他任何事情。如果一个答案是错误的并且会误导未来的读者,那么它应该得到低分。如果同样的答案后来得到了改进,变得正确和有用,那么它应该得到高分。这两种情况都不是对你作为程序员或人类的反映,只是对答案本身的价值的评估。 - abarnert
谢谢Abarnert...我不确定撤销部分。再次点赞给你....截至今天,我因为提问而被禁言.....老实说,我不确定为什么。我的回答本身并没有留下印象,但如果你看看我的其他问题/答案,你会明白我在SO上仍然做得很好.....试图以某种方式解除禁令。将继续努力并以最佳方式贡献,并尝试注意错别字等问题... - Guddu
请查看问题中新增的部分,该部分位于百分号字符串之后(注释空间有限)。非常感谢您的帮助。 - Will Zimmerman
@Guddu:这听起来像是你可能想在meta上搜索(或询问)的内容。(我仍然没有弄清楚这里有一半的东西是如何工作的。) - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接