python - 在多个目录中使用 __init__.py 进行模块化

1 投票
3 回答
1614 浏览
提问于 2025-04-16 15:06

我现在有点搞不懂这个问题。

假设我有一个文件夹结构,长得像这样:

~/speech
-- __init__.py
-- program.py
----------------
~/speech/parts
----__init__.py
----noun.py
----verb.py
----------------
~/speech/sentence
----__init__.py
----subject.py
----predicate.py

这些 __init__.py 文件是空的。我是通过输入 $ touch __init__.py 来创建它们的。
当我尝试导入任何东西时,都会出现 NameError: 'whatever' not defined 的错误。
我试过把 whatever 当作文件夹名和单个文件名来用。

我在 Python 中遇到的其他问题,通常都是因为我想得太复杂了,把事情搞得比实际情况还要复杂。(真是受够了 C++ 的习惯!)

3 个回答

1

你可以快速把你当前的文件夹添加到Python的搜索路径中,方法是:

export PYTHONPATH=$(pwd)

这里有一些背景信息,你可以看看:

Python的模块搜索路径

1

除非 ~ 是你当前的目录,或者它在 sys.path 里面(其实不应该在里面),否则你就无法使用里面的任何包,包括 speech 及其子包。把这个目录结构放到一个合理的位置,然后把这个路径加到 $PYTHONPATH 里。

1

好的,我终于搞明白了。

如果我想让它看起来像“Java风格的类”,那么我就用下面的方式导入:

import parts.noun  
import sentence.subject  
parts.noun.defineNouns()  
sentence.subject.thePersonOrThing()  

如果我想让它看起来更像C/C++风格的库调用,那么我就用下面的方式导入:

from parts.noun import defineNouns  
from sentence.subject import thePersonOrThing  
defineNouns()  
thePersonOrThing()  

*叹气* 这真是太简单了,反而让我觉得难。

撰写回答