什么是没有PYTHONPATH的PYTHONPATH?

Wil*_*man 6 python linux environment-variables

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

我无法附加不存在的东西,但是我希望当前发现的所有重要库仍然有用,所以要小心谨慎,从Python中我print str(sys.path)得到了所有的标准值.然后我定义了一个env-variable来PYTHONPATH包含我刚刚找到的所有节点,以及我的新目录.但哇做了很多东西停止工作!Python是如此混乱的新env变量,我必须删除它,此时一切都工作了.由于糟糕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   
Run Code Online (Sandbox Code Playgroud)

使用它作为PYTHONPATH(即,在调用Python之前定义一个env变量),即使没有显式使用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
Run Code Online (Sandbox Code Playgroud)

错误在于认为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
Run Code Online (Sandbox Code Playgroud)

所以它似乎工作,虽然我还没有尝试使用上面提到的postgresql包.仍然有点神秘的是为什么在PYTHONPATH中添加大量不必要的节点会使事情像它一样严重破坏,特别是因为我从应该是可靠的源:sys.path获得条目.

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

che*_*ner 7

目前还不清楚你的问题是什么,但请注意,你不需要sys.path为你的PYTHONPATH变量添加默认值.你把目录PYTHONPATH额外的搜索目录; 系统默认值会附加到您的PYTHONPATH.换句话说,粗略地说:

sys.path = ":".split( os.environ['PYTHONPATH'] ) + sys.path
Run Code Online (Sandbox Code Playgroud)

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


Gud*_*ddu 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')
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 您意识到,如果您修复了答案,则可以撤消否决票,对吧?另外,请记住,投票是关于答案的有用程度,而不是其他。如果答案不正确并且误导了未来的读者,则该答案应该得分较低。如果相同的答案后来得到改进,使其正确且有用,则应该获得高分。两者都不是对你作为程序员或人类的反思,而只是对答案的优点的反思。 (2认同)