如何构建Python包(?)以将文件添加到单个模块

时间:2018-02-22 16:04:16

标签: python module packages

我是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'

我有点困惑,我是否以错误的方式完全构建我的项目,或者是否只是一个我缺少的小细节。我在这做错了什么?我正在拼命寻找一个关于如何使用模块的子目录构建包的示例。我尝试查找默认模块,但他们显然没有附带自述文件。

1 个答案:

答案 0 :(得分:0)

似乎您想将当前子模块转换为子包。

你尝试解决问题的结构几乎是正确的,但过去的MyOps.FileOperations现在是MyOps.FileOperations.FileOperations,这几乎肯定不是你想要的。

我认为您创建的__init__.py个文件是空的。如果是这样,只需删除它们,并将子目录中的其他文件重命名为__init__.py

当Python初始化模块时,它会运行模块的.py文件中的代码。但是,要初始化程序包,它会运行程序包的__init__.py文件中的代码,因此(例如)文件f中定义的函数MyOps/FileOperations/__init__.py可以从{{1}导入或者,您可以继续导入MyOps.FileOperations子包并使用其中的函数作为属性。