Python在以交互/非交互方式运行时以不同方式导入模块

Python在以交互/非交互方式运行时以不同方式导入模块,python,interactive,egg,non-interactive,Python,Interactive,Egg,Non Interactive,我的一个Python脚本以交互模式运行,但从命令行运行时失败。不同之处在于,当从命令行运行时,它从bad.egg文件导入模块,当以交互方式运行时,它在当前目录中使用我的固定(解压缩)版本 我的问题有两个:a)为什么Python在从这些位置运行时加载模块会有所不同,以及b)我有哪些解决方法?在UNIX系统和Mac OS-X上: 你有~/.python目录吗 独立操作系统: 您确定在这两种情况下使用相同的Python实例吗 您能否在每种情况下打印sys.path,并查看模块搜索路径上哪个程序包

我的一个Python脚本以交互模式运行,但从命令行运行时失败。不同之处在于,当从命令行运行时,它从bad.egg文件导入模块,当以交互方式运行时,它在当前目录中使用我的固定(解压缩)版本


我的问题有两个:a)为什么Python在从这些位置运行时加载模块会有所不同,以及b)我有哪些解决方法?

在UNIX系统和Mac OS-X上:

  • 你有
    ~/.python目录吗
独立操作系统:

  • 您确定在这两种情况下使用相同的Python实例吗

  • 您能否在每种情况下打印
    sys.path
    ,并查看模块搜索路径上哪个程序包目录位于第一位


我不明白以交互模式运行脚本是什么意思,所以我不能确切地说。但在交互模式下查找模块(
sys.path[0]
)的第一个位置是当前目录(即使调用
os.chdir()
,也会影响导入),而对于脚本,它是脚本所在的目录(派生自
sys.argv[0]
)。请注意,当脚本从其所在的目录运行时,它们实际上是相同的,但在其他情况下可能不同。希望这能有所帮助。

a)为什么Python在这些位置运行时加载模块会有所不同 b) 我有什么办法来解决这个问题

检查环境变量PYTHONPATH。当python导入模块时,它会搜索这些目录。解决问题的一种方法是将本地文件夹“当前目录中的(解压缩)版本”添加到PYTHONPATH的开头,以便python首先找到它

这对我很有用:

import sys

sys.path[0]=''

交互式会话是在普通python中运行还是在IPython中运行?后者可能有不同的PYTHONPATH和导入规则。谢谢,LNK2019。即使将本地解压版本添加到PYTHONPATH也不能解决这个问题,因为.egg文件出现在我在.profile中设置的PYTHONPATH之前。不过,直接删除bad.egg文件会处理好它。谢谢fviktor。我没有~/.python目录,但它是PYTHONPATH的问题。因为将解压版本添加到我的路径并不能解决这个问题(因为.egg文件仍然是先加载的),所以我只是删除了.egg。现在我想起来了。我以前也遇到过类似的问题,当时我不得不修复从egg文件安装的Trac扩展。以未压缩的形式安装egg包允许我在安装后更改包中的源代码。但是是的,正如您前面提到的,必须从SitePackages目录中删除egg文件,否则它将优先于解压缩的源代码树。您可以通过以下方式以解压缩的形式安装鸡蛋:easy\u install.py--始终将包解压缩到\u install.egg文档:easy\u install--帮助谢谢Denis。这就是问题所在,请看下面我的评论。