PYTHONPATH - 针对不同的Python安装动态设置?

2 投票
2 回答
1065 浏览
提问于 2025-04-17 03:36

在我的CentOS5服务器上,我同时安装了Python2.4和2.6(2.4是yum正常工作的必要条件)。我不太清楚发生了什么,但突然之间,每当我尝试运行一个加载了2.4的模块的文件时,系统就变得非常混乱。我检查了PYTHONPATH和sys.path,发现它们似乎被2.6的环境数据覆盖了。

以前并不是这样的。我只需在脚本开头的shebang语句中声明/usr/bin/python或/usr/bin/python26,它总是能找到正确的模块。

有没有办法让PYTHONPATH变量动态变化,根据运行的Python解释器加载不同的路径呢?

否则,我就得手动在每个应用程序中编辑路径,这样似乎太麻烦了。

这个问题是在我安装了web.py之后开始的(顺便说一下,我非常喜欢这个库)。

错误追踪: 正如下面有人评论的,我把这个程序的shebang改成了#!/usr/bin/env python:

Traceback (most recent call last):
  File "/usr/bin/linkchecker", line 24, in ?
    import codecs
  File "/usr/lib/python2.6/codecs.py", line 268
    return (b"", 0)
              ^

另一个例子,尝试使用yum:

Traceback (most recent call last):
  File "/usr/bin/yum", line 5, in ?
    import yum
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 21, in ?
    import os
  File "/usr/lib/python2.6/os.py", line 758
    bs = b""
           ^

我注意到有几个程序没有被b""语法困扰,所有这些程序都是为了使用2.4而编写的,但出于某种原因却在使用2.6。如果我尝试让程序使用2.6解释器,它能理解那种语法,但却找不到其他模块(这些模块在2.4的site-packages目录中)。

我不知道那种语法是什么,因为它们是我从sourceforge上获取的模块,但上周它们是可以正常工作的。我不确定发生了什么变化。

谢谢,
Tom

2 个回答

1

与其使用文件开头的那种特殊标记(称为shebang)

#!/usr/bin/python

不如直接使用shebang

#!/usr/bin/env python

补充:我支持Noufal的建议,使用虚拟环境(virtualenv)。

2

首先,使用virtualenv来为多个Python安装隔离包。这样做后,你的大部分问题都会立刻消失。

其次,正如Ibp在他的回答中建议的那样,修改shebang行,使用“当前活跃”的Python二进制文件,这样它就能在多个解释器中正常工作。

撰写回答