子目录的 Python 导入行为不一致

问题描述 投票:0回答:1

当将我的 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 抱怨导入而不会使我的代码变得太复杂?

python python-3.x python-import
1个回答
0
投票

不要触摸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

 来调用它。

© www.soinside.com 2019 - 2024. All rights reserved.