我主要使用PHP,在作曲家之后特别容易导入类。但是我很难在Python项目中应用相同的目录结构。
我有以下目录结构。
backend
commands
indices.py
backup.py
etc.py
components
mapping
product.py
storage
Es.py
interfaces
StorageInterface.py
IndexInterface.py
我的命令文件夹基本上是我将通过cli运行的文件,因为组件将保存实际的业务逻辑,接口只包含组件的ABC。
我必须在整个代码中进行多次导入,有时从相同的文件夹中进行子文件夹,有时甚至是同一级别的另一个文件夹。
例如在我的indices.py文件中,我有这个导入
from components.storage.Es import Es
这给了我
root@07fc62bd3c97:/backend/commands# python indices.py --help
Traceback (most recent call last):
File "indices.py", line 1, in <module> from components.storage.Es import Es ImportError: No module named components.storage.Es
我已经在SO上找到了其他答案,并发现了将sys和os模块放入运行时添加文件的非常脏的解决方案。当它的1 2个文件但管理整个项目看起来非常糟糕时,这可能没问题。
我的问题是
1 - 我是否遵循管理项目的pythonic方式 2 - 如何以一种干净的方式访问我的所有类文件
由于
答案 0 :(得分:1)
您需要__init__.py
,commands
,components
,mapping
和storage
子目录中的interfaces
个文件,以便这些目录和其中包含的文件被python视为模块。此外,具有与在其中定义的某个类相同名称的单个模块实际上不是pythonic。例如,最好让interfaces
模块由interfaces.py
文件定义,该文件包含两个接口类,而不是包含两个名为StorageInterface.py
和IndexInterface.py
的文件。每个都包含一个类定义(我假设你正在那里做什么)。
此外,重要的是从哪个目录启动python进程。为了使该导入路径有意义,我非常确定您需要从backend
目录中启动python进程。或者您需要通过components
env var或其他方式将commands
,PYTHONPATH
等子目录的文件系统路径添加到python的模块路径中方法
答案 1 :(得分:1)
将整个backend
文件夹视为一个包。如果您使用的是遗留Python(Python 2),则需要将__init__.py
个文件放在所有文件夹中,以便它们可以作为子包导入。您需要调整导入,然后调整为from backend.components.storage.Es
或from ..components.storage.Es
(相对导入)。
然后,因为它是一个包,你会发现你不能进入子文件夹并执行代码。然后,修复程序是使用backend/commands/backup.py
模块标记-m
从包含python -m backend.commands.backup
的文件夹中运行代码(例如backend
)。如果需要,您可以稍后通过创建一个setup.py
来添加一个入口点,将其变为更漂亮的命令。