【问题标题】:Python import works when running module but breaks when this module is importedPython 导入在运行模块时有效,但在导入此模块时中断
【发布时间】:2014-11-23 01:28:53
【问题描述】:

我有一个这样的目录结构:

source\
  main\
    bar.py
    run.py
  A\
    foo.py

bar.py 具有foo.py 需要的功能,所以我使用from bar import *,因为我已经为foo.py 提供了找到bar.py 的正确路径。我通过运行foo.py 并从bar.py 调用任何函数而不在其旁边附加bar 来验证这一点。例如,如果myFun 定义在bar.py 中,我可以简单地在foo.py 中调用myFun(...)。到目前为止,这一切都很好。

run.py 导入 foo.py。但是,当我尝试从 foo.py 运行一个函数时,该函数又使用从 bar.py 导入的函数,Python 声称 myFun(...) 不存在。请注意,myFun 最初是在 bar.py 中定义的。

NameError: global name 'myFun' is not defined

我设法解决此问题的唯一方法是将myFun 复制到foo.py,但这并不是真正的解决方案。

【问题讨论】:

  • 不确定它是否有效,但您可以尝试在 foo.py 中创建一个执行 myFun 的函数,如果没有,为什么不直接将 bar.py 导入 run.py 文件?
  • 请提供代码sn-ps。在导入时更容易准确理解您使用的语义。
  • 你身边有不同的bar.py吗?在foo.py 中,添加import bar;print os.path.abspath(bar.__file__)。此外,在 foo.py 中,添加 from bar import myFun ... 这应该会更早地触发错误(并且更接近故障)。
  • run.py,你在做from foo import *吗?您是否在 foo 中使用 __all__ 变量(这会掩盖您导入的内容)?

标签: python python-2.7 import


【解决方案1】:

只要您有其他选择,您就应该避免摆弄导入路径。在这种情况下,创建空文件 main\__init__.pyA\__init__.py 以便 Python 将这些目录识别为包,将 foo.py 中的 bar 替换为 main.bar 并从顶部源目录运行它。

现在,将函数从 foo.py 导入到 run.py 应该很简单:

from A.foo import fooFun1, fooFun2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多