我习惯了一种脚本语言,在这种语言中,像这样布置模块是很常见的:
lib/Foo.pm
lib/Foo/Bar.pm
lib/Foo/Baz.pm
在你有 Foo.pm 的地方,有一个名为 Foo 的目录,你可以在下面放置子模块。
在 Python 中,我尝试模仿这样的布局:
modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
但是,这行不通,因为当我这样做时:
from foo import Foo
Python 认为我正在导入名为“foo”的目录而不是 foo.py。我试图搞乱 init.py 业务无济于事。
有没有办法解决这个问题?我觉得 Python 无法区分目录 foo 和文件 foo.py 很烦人。
编辑: 我想我错过了一个重要的部分。我通过单元测试获取 modules/目录,因此整个目录结构如下所示:
modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
tests/unit.py
在 unit.py 中,我有以下内容:
#!/usr/bin/python
import sys
import os
findbin = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.path.append(findbin + "/../modules")
from foo import Foo
obj = Foo()
当我运行它时,我得到:
from foo import Foo
ImportError: cannot import name Foo
请您参考如下方法:
您要创建的是包。
在文件夹 foo 中放置一个名为 __init__.py 的空白文件。然后 Python 会将 foo 视为一个包。如果 modules 也被视为一个包,则在其中也放置一个空白的 __init__.py。
所以从你的问题来看,如果包正确完成并且你有这个结构:
modules/__init__.py
modules/foo/__init__.py
modules/foo/bar.py
modules/foo/baz.py
你可以这样做:
import module
from module import foo
from module.foo import bar
import module.foo.bar as foobar
还有很多其他的东西!
