Skip to main content
 首页 » 编程设计

子目录名称与文件相同的Python模块布局

2025年05月04日15soundcode

我习惯了一种脚本语言,在这种语言中,像这样布置模块是很常见的:

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 

还有很多其他的东西!