Python在以交互/非交互方式运行时以不同方式导入模块
我的一个Python脚本以交互模式运行,但从命令行运行时失败。不同之处在于,当从命令行运行时,它从bad.egg文件导入模块,当以交互方式运行时,它在当前目录中使用我的固定(解压缩)版本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,并查看模块搜索路径上哪个程序包
我的问题有两个: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。这就是问题所在,请看下面我的评论。