在 Python 中动态合并文件模块与目录模块
Dynamically merging file modules with directory modules in Python
给定一个具有以下结构的目录:
├── foo
│ ├── bar
│ │ └── baz.py
│ └── bar.py
└── foo.py
和以下文件内容:
foo.py
class Foo:
pass
foo/bar.py
class Bar:
pass
foo/bar/baz.py
class Baz:
pass
我希望能够从其他文件中执行所有这些操作:
from foo import Foo
from foo.bar import Bar
from foo.bar.baz import Baz
即好像每个文件中的定义都是 "merged",模块定义包含同名目录。我怎样才能以不需要我手动指定每个路径的动态方式(无论涉及 __init__.py
还是其他方式)完成此操作?
当我在每个目录中放置空 __init__.py
文件并尝试执行上述导入时,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
from foo import Foo
ImportError: cannot import name 'Foo'
在我看来,foo.py
文件已被 foo
目录覆盖,因此 foo.py
中的定义不可见。
尝试做:
import foo
print(foo.__file__)
根据您显示的文件夹结构,我希望结果类似于:
.../foo.py
但是当您将 __init__.py
添加到 foo
文件夹时,它会变成:
.../foo/__init__.py
with python packages you cannot actually import a folder 所以最终发生的是你从那个文件夹导入 __init__.py
文件而不是 foo.py
所以你只需要要做的是将 foo.py
移动到文件夹中,然后 将其 重命名为 __init__.py
然后您可以 import foo
或 from foo import Foo
与你现在已经设置好了。
给定一个具有以下结构的目录:
├── foo
│ ├── bar
│ │ └── baz.py
│ └── bar.py
└── foo.py
和以下文件内容:
foo.py
class Foo:
pass
foo/bar.py
class Bar:
pass
foo/bar/baz.py
class Baz:
pass
我希望能够从其他文件中执行所有这些操作:
from foo import Foo
from foo.bar import Bar
from foo.bar.baz import Baz
即好像每个文件中的定义都是 "merged",模块定义包含同名目录。我怎样才能以不需要我手动指定每个路径的动态方式(无论涉及 __init__.py
还是其他方式)完成此操作?
当我在每个目录中放置空 __init__.py
文件并尝试执行上述导入时,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
from foo import Foo
ImportError: cannot import name 'Foo'
在我看来,foo.py
文件已被 foo
目录覆盖,因此 foo.py
中的定义不可见。
尝试做:
import foo
print(foo.__file__)
根据您显示的文件夹结构,我希望结果类似于:
.../foo.py
但是当您将 __init__.py
添加到 foo
文件夹时,它会变成:
.../foo/__init__.py
with python packages you cannot actually import a folder 所以最终发生的是你从那个文件夹导入 __init__.py
文件而不是 foo.py
所以你只需要要做的是将 foo.py
移动到文件夹中,然后 将其 重命名为 __init__.py
然后您可以 import foo
或 from foo import Foo
与你现在已经设置好了。