Python在交互/非交互模式下导入模块的方式不同

5

我的一个Python脚本在交互模式下运行正常,但从命令行运行时失败。不同之处在于,当从命令行运行时,它会从一个错误的.egg文件中导入模块,而在交互模式下运行时,则使用当前目录中修复后的(未压缩的)版本。

我的问题有两个方面:a)为什么Python在这些位置运行时加载模块的方式不同,b)我有哪些选项可以解决这个问题?


交互式会话是在纯Python中运行还是在IPython中运行?后者可能具有不同的PYTHONPATH和导入规则。 - Boris Gorelik
4个回答

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

感谢Denis。这最终被证明是问题所在——请参见我下面的评论。 - Dan

2

在 UNIX 系统和 Mac OS X 上:

  • 您是否有一个 ~/.python-eggs 目录?

与操作系统无关:

  • 您确定两种情况下使用的是同一个 Python 实例吗?

  • 您可以在每种情况下打印 sys.path 并查看哪个包目录在您的模块搜索路径中排在第一位吗?


感谢fviktor。我没有~/.python-eggs目录,但这是PYTHONPATH的问题。由于将未压缩版本添加到路径中并没有解决这个问题(因为.egg文件仍然首先加载),所以我只是删除了.egg文件。 - Dan
现在我记得了。以前我修复Trac扩展时也遇到过类似的问题,当时是从egg文件安装的。以未压缩的形式安装该egg包后,我可以在安装后更改该包中的源代码。但是,正如您上面提到的那样,必须从site-packages目录中删除egg文件,否则它将优先于解压缩的源树。您可以通过以下方式以未压缩的形式安装egg:easy_install.py --always-unzip package_to_install.egg文档:easy_install --help - fviktor

1

a) Python为什么在不同的位置运行时会以不同的方式加载模块? b) 我有哪些选项可以解决这个问题?

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


感谢,LNK2019。即使将本地未压缩版本添加到PYTHONPATH中也无法解决问题,因为.egg文件出现在我在.profile中设置的PYTHONPATH之前。不过,直接删除错误的.egg文件就解决了问题。 - Dan

0
这对我有效:
import sys

sys.path[0]=''

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