Python 导入从同一目录导入的模块

Python 导入从同一目录导入的模块,python,python-3.x,Python,Python 3.x,假设我有一个项目设置如下: myproject/ setup.py myproject/ __init__.py module1/ __init__.py a.py b.py test/ __init__.py test.py 在a.py中,我有: 在test.py中,我有: 当我运行test.py时,我得到一个ImportError,因为找不到b—因为test.py位于不同的目录中 我知道

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

myproject/
  setup.py
  myproject/
    __init__.py
    module1/
      __init__.py
      a.py
      b.py
      test/
        __init__.py
        test.py
在a.py中,我有:

在test.py中,我有:

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

我知道我可以在a.py中通过从myproject.module1.b导入一些东西来解决这个问题,但这似乎太冗长了,无法在整个项目中完成

有更好的办法吗?

我想你可以用

from .b import Something
因为这是相对的,所以应该一直有效

我想你可以用

from .b import Something
因为这是相对的,所以应该一直有效

请参见myproject中的

。模块1.b导入内容是最好的方法。它可能有点冗长,但它是显式的,这在Pythonic代码中通常是一种理想的质量。

来自myproject.module1.b import Something是最好的方法。它可能有点冗长,但它是显式的,这在Pythonic代码中通常是一个理想的质量

但这可能不是你问题的完整解决方案。与在更高级别的目录结构中导入模块/包的任何模块一样,您必须小心如何运行它。具体地说,以python submodule.py的形式运行模块会隐式地将模块的_name__变量设置为_main__。由于相对导入和绝对导入都依赖于_name______________________________________________

尝试运行tests.py作为

从包的顶层开始,而不是直接运行它

你可以试试a.py,例如

但这可能不是你问题的完整解决方案。与在更高级别的目录结构中导入模块/包的任何模块一样,您必须小心如何运行它。具体地说,以python submodule.py的形式运行模块会隐式地将模块的_name__变量设置为_main__。由于相对导入和绝对导入都依赖于_name________________________________________

尝试运行tests.py作为


从包的顶层开始,而不是直接运行它

在我的项目中也需要一个_uinit__uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?这是蟒蛇路径吗?@Alex是的,抱歉。模块1的父级myproject位于PythonPath上。在myproject中是否也需要一个_init__u;.py?这是蟒蛇路径吗?@Alex是的,抱歉。模块1的父级myproject位于PYTHONPATHI上,我知道这一点,但它似乎是一个黑客补丁。另外,PEP8:对于包内导入的相对导入是非常不鼓励的。我知道这一点,但它似乎是一个黑客补丁。此外,PEP8:对于包内导入的相对导入是非常不受鼓励的。虽然Freaky Dag和@Evert都是正确的,但这是基于:对于包内导入的相对导入是非常不受鼓励的。始终对所有导入使用绝对包路径虽然Freaky Dug和@Evert都是正确的,但这是基于以下条件的更好的解决方案:对于包内导入的相对导入是非常不鼓励的。对所有导入始终使用绝对包路径
from .b import Something
from .b import Something
python myproject/module1/test/test.py