2

假设我有一个项目设置如下:

myproject/
  setup.py
  myproject/
    __init__.py
    module1/
      __init__.py
      a.py
      b.py
      test/
        __init__.py
        test.py

a.py我有:

from b import Something

test.py我有:

from myproject.module1 import a

当我运行时,test.py我得到一个ImportError因为b找不到 - 因为 test.py 在不同的目录中。

我知道我可以a.py通过写作来解决这个问题from myproject.module1.b import Something,但这似乎过于冗长,无法在整个项目中完成。

有没有更好的办法?

4

3 回答 3

2

我认为你可以使用

from .b import Something

由于这是相对的,它应该始终有效。

请参阅http://docs.python.org/3/tutorial/modules.html#intra-package-references

于 2013-01-11T15:23:01.483 回答
1

from myproject.module1.b import Something是最好的方法。它可能有点冗长,但它是明确的,这通常是 Pythonic 代码中理想的品质。

于 2013-01-11T15:29:34.097 回答
1

您可以尝试相对导入a.py例如

from .b import Something

但这可能不是您问题的完整解决方案。与import在更高级别的目录结构中模块/打包的任何模块一样,您必须小心运行它的方式。具体来说,以python submodule.py隐式方式运行模块会将模块的__name__变量设置为"__main__". 由于导入(相对和绝对相似)依赖于 that__name__PYTHONPATH,因此直接运行子模块可能会使导入行为不同(或中断,如您的情况)。

尝试运行您的tests.pyas

python myproject/module1/test/test.py

从包的顶层而不是直接运行它。

于 2013-01-11T15:30:37.777 回答