当将我的 python 代码分割成简单的模块并将它们放入子目录中时,我看到看似不一致的行为,但我无法通过在模块中添加
__init__.py
文件来解决该问题。我也无法理解为什么事情似乎不一致。请解释或指出解释此“逻辑”的文档:
我有以下文件结构:
a.py
module/b.py
module/c.py
文件包含以下内容:
a.py:
from module.b import hello
hello()
b.py:
from c import helloworld
def hello():
helloworld()
hello()
c.py:
def helloworld():
print("Hello world")
当我运行 b.py 时一切正常:
# cd module/
# python b.py
Hello world
但是当我从父目录运行a.py时,python突然不知道在哪里可以找到c.py:
# python a.py
Traceback (most recent call last):
File "python-playground/a.py", line 1, in <module>
from module.b import hello
File "python-playground/module/b.py", line 1, in <module>
from c import helloworld
ModuleNotFoundError: No module named 'c'
我怎样才能使我可以同时运行
module/b.py
和 a.py
而不会让 Python 抱怨导入而不会使我的代码变得太复杂?
不要触摸sys.path
,即使这听起来很诱人并且很容易解决——它会导致痛苦和混乱。你的结构应该是
a.py
module/__init__.py
module/b.py
module/c.py
所以module
成为一个(令人困惑的名称)包。然后,在例如内导入
module/b.py
应该是
from module import c
from . import c
from .c import some_name
module
内有应该可执行的脚本,例如
module/show_bees.py
,
from module.b import bee_movie
def main():
print(bee_movie())
if __name__ == "__main__":
main()
您可以使用 python -m module.show_bees
来调用它。