Python在交互式与非交互式运行时导入模块的行为不同

5 投票
4 回答
2685 浏览
提问于 2025-04-15 16:14

我有一个Python脚本,在交互模式下可以正常运行,但从命令行运行时却出错。原因是从命令行运行时,它会从一个有问题的.egg文件中导入模块,而在交互模式下,它会使用我在当前目录下修复过的(解压缩的)版本。

我有两个问题:a) 为什么Python在这两种情况下加载模块的方式不同?b) 我有什么办法可以解决这个问题?

4 个回答

1

a) 为什么在不同的地方运行Python时,它加载模块的方式会不一样?

b) 我有什么办法可以解决这个问题?

你可以检查一下你的环境变量PYTHONPATH。当Python导入模块时,它会在这些目录里寻找。解决你问题的一种方法是把你本地的文件夹(也就是当前目录下解压后的版本)添加到PYTHONPATH的最前面,这样Python就会优先找到它。

2

在UNIX系统和Mac OS-X上:

  • 你有没有一个叫~/.python-eggs的文件夹?

与操作系统无关:

  • 你确定在这两种情况下使用的是同一个Python环境吗?

  • 你能在每种情况下打印出sys.path吗?看看哪个包的文件夹在你的模块搜索路径中排在最前面?

3

我不太明白你说的在交互模式下运行脚本是什么意思,所以我不能确切回答。不过,在交互模式下,查找模块的第一个地方是当前目录(即使调用 os.chdir() 也会影响导入),而对于脚本来说,查找模块的地方是脚本所在的目录(这个目录是从 sys.argv[0] 得到的)。需要注意的是,当脚本从它所在的目录运行时,这两者实际上是一样的,但在其他情况下可能会不同。希望这能帮到你。

撰写回答