6

我需要向我的 . 添加一个新的目录位置PYTHONPATH,但问题是我在一个干净的、新安装的系统 (Linux) 上,PYTHONPATH尚未定义。我已经阅读并使用过PYTHONPATH,并且我认为我已经很好地理解了它,但是我不知道当不PYTHONPATH存在时发生了什么。

我不能附加到不存在的东西上,但我希望目前发现的所有重要库仍然可以工作,所以要小心,从 Pythonprint str(sys.path)中获取所有标准值。然后我定义了一个env-variable 来PYTHONPATH包含我刚刚找到的所有节点,以及我的新目录。但是哇,很多东西都停止工作了!Python 对新的env-variable 感到如此混乱,以至于我不得不将其删除,此时一切都恢复了。糟糕PYTHONPATH的是,系统非常混乱,当在提示符下输入不正确的命令时,甚至找不到要显示的错误消息。

我的问题不是像缺少冒号这样简单的问题,或者当我应该使用冒号时使用分号;我检查了。我的新目录也不会导致问题,因为即使没有新节点,问题仍然存在。那么谁能解释为什么这种方法不起作用?

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

下面我根据要求提供了额外的详细信息,但无需再阅读任何内容,我认为问题已解决。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 需要包含所有需要的东西的整个宇宙。是的,我在发帖之前做过 RTFM,但我想我错过了开头单词“Augment”的意义。因此,接受并非所有内容都需要明确指定的建议——可以只指定一个人想要的额外添加,我尝试了:

$> 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。

但无论如何,它可能已经解决了,所以谢谢!

4

2 回答 2

7

目前尚不清楚您的问题可能是什么,但请注意,您不需要将默认值添加sys.pathPYTHONPATH变量中。您放入的目录是要搜索PYTHONPATH附加目录;系统默认值附加到您的PYTHONPATH. 换句话说,粗略地说:

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

显示的确切值PYTHONPATH和由此产生的错误将有助于我们确定问题。

于 2013-01-25T19:43:31.577 回答
1

On Unix Systems, it should translate to /usr/local/lib/python** where ** is Python version...Like 2.7 and so on...

Your answer actually lies in the definition of PYTHONPATH and PYTHONHOME variables.

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

The default search path is installation dependent, but generally begins with prefix/lib/pythonversion (see PYTHONHOME above). It is always appended to PYTHONPATH.

I would suggest you also try this

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

Hope this helps.

于 2013-01-25T19:40:45.277 回答