【发布时间】:2022-06-13 17:41:26
【问题描述】:
我有结构
main.py from mymodule import a; a.A()
mymodule/
mymodule/__init__.py (empty)
mymodule/a.py # works when called from main.py, fails when called alone
mymodule/b.py class B: pass
mymodule/c.py class C: pass
mymodule/test.py from .a import A; A() # failing when called alone
在a.py 中有:
from .b import B
from .c import C
class A:
def __init__(self):
self.b = B()
self.c = C()
if __name__ == '__main__':
A()
调用main.py 效果很好。它调用a.py 调用from .b import B。
但单独调用 a.py 失败同样 from .b import B 与:
ImportError: 尝试在没有已知父包的情况下进行相对导入
我已经阅读了Relative imports in Python 3 和许多类似的问题,例如How to import the class within the same directory or sub directory?,但这里这个问题是针对:
为什么从main.py 调用a.py 时from .b import B 会成功,而单独从a.py 调用或调用test.py 时会失败?
如何能够在与a.py 相同的目录中拥有test.py 并能够导入后者?(没有sys.path.append hacks)
【问题讨论】:
-
“单独调用 a.py”是什么意思?你到底是做什么的?
-
@9769953 我的意思是:
cd mymodule; python3 test.py; python3 a.py -
不要像脚本一样执行模块。模块应该被导入,而不是运行。除非您将它们设为可执行模块,但即便如此,它们也应该以不同的方式“运行”。
-
@9769953 1/2 我最初并没有特别想把它变成一个模块,我更喜欢一切都是“脚本”。但我创建了一个模块,因为它是从同一目录和/或子目录导入另一个 .py 文件的唯一非 sys-path-hack 选项。
-
@9769953 2/2 但是即使是在一个模块中,有一个像
test.py这样的脚本来做一个模块特性的demo也是有意义的,并且这个与模块本身在同一个文件夹中。
标签: python import python-import