【问题标题】:Python importing modules differently when run interactively/non-interactivelyPython 在交互/非交互运行时导入模块的方式不同
【发布时间】:2010-12-19 03:48:50
【问题描述】:

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

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

【问题讨论】:

  • 交互式会话是在普通 python 中运行还是在 IPython 中运行?后者可能有不同的 PYTHONPATH 和导入规则。

标签: python interactive egg non-interactive


【解决方案1】:

在 UNIX 系统和 Mac OS-X 上:

  • 您有~/.python-eggs 目录吗?

独立于操作系统:

  • 您确定在这两种情况下都使用同一个 Python 实例吗?

  • 您能否在每种情况下打印 sys.path 并查看模块搜索路径中哪个包目录排在首位?

【讨论】:

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

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

【讨论】:

  • 谢谢丹尼斯。事实证明这就是问题所在——请参阅下面的我的 cmets。
【解决方案3】:

a) 为什么 Python 从这些位置运行时加载模块的方式不同 b) 我有哪些解决方法?

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

【讨论】:

  • 谢谢,LNK2019。即使将本地解压缩版本添加到 PYTHONPATH 也不能解决问题,因为 .egg 文件位于我在 .profile 中设置的 PYTHONPATH 之前。不过,彻底删除坏的 .egg 文件可以解决问题。
【解决方案4】:

这对我有用:

import sys

sys.path[0]=''

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2016-04-05
    • 2018-09-20
    • 1970-01-01
    • 2012-05-20
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多