我是Python模块/包构建行业的新手。我在某些目录中的某些文件中有一些方法。我们假设它看起来像这样:
MyOps/
|--FileOperations.py
|--DirectoryOperations.py
|--StringOperations.py
|--__init__.py
每个*.py
文件包含许多方法,从语义角度来看,将它们放在一起是不可取的。从目录外部,我可以简单地使用这些模块(例如,来自ops.py
姐妹的文件MyOps/
:
from MyOps import DirectoryOperations
DirectoryOperations.delete_tree("my/path")
在实践中,这很好用。但是,我想分别为每个模块添加README文件(并且可能为相应模块添加模块特定文件)。我原本以为可以按如下方式更改目录结构:
MyOps/
|--FileOperations/
| |--FileOperations.py
| |--README.md
| |--__init__.py
|--DirectoryOperations/
| |--DirectoryOperations.py
| |--README.md
| |--__init__.py
|--StringOperations/
| |--StringOperations.py
| |--README.md
| |--__init__.py
| |--examples/
| |--...
|--__init__.py
但是,当我尝试上面的import语句时,我收到一个错误:
module 'MyOps.DirectoryOperations' has no attribute 'delete_tree'
我有点困惑,我是否以错误的方式完全构建我的项目,或者是否只是一个我缺少的小细节。我在这做错了什么?我正在拼命寻找一个关于如何使用模块的子目录构建包的示例。我尝试查找默认模块,但他们显然没有附带自述文件。
答案 0 :(得分:0)
似乎您想将当前子模块转换为子包。
你尝试解决问题的结构几乎是正确的,但过去的MyOps.FileOperations
现在是MyOps.FileOperations.FileOperations
,这几乎肯定不是你想要的。
我认为您创建的__init__.py
个文件是空的。如果是这样,只需删除它们,并将子目录中的其他文件重命名为__init__.py
。
当Python初始化模块时,它会运行模块的.py
文件中的代码。但是,要初始化程序包,它会运行程序包的__init__.py
文件中的代码,因此(例如)文件f
中定义的函数MyOps/FileOperations/__init__.py
可以从{{1}导入或者,您可以继续导入MyOps.FileOperations
子包并使用其中的函数作为属性。