在python中导入项目文件

时间:2017-09-12 23:24:34

标签: python

我主要使用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 - 如何以一种干净的方式访问我的所有类文件

由于

2 个答案:

答案 0 :(得分:1)

您需要__init__.pycommandscomponentsmappingstorage子目录中的interfaces个文件,以便这些目录和其中包含的文件被python视为模块。此外,具有与在其中定义的某个类相同名称的单个模块实际上不是pythonic。例如,最好让interfaces模块由interfaces.py文件定义,该文件包含两个接口类,而不是包含两个名为StorageInterface.pyIndexInterface.py的文件。每个都包含一个类定义(我假设你正在那里做什么)。

此外,重要的是从哪个目录启动python进程。为了使该导入路径有意义,我非常确定您需要从backend目录中启动python进程。或者您需要通过components env var或其他方式将commandsPYTHONPATH等子目录的文件系统路径添加到python的模块路径中方法

答案 1 :(得分:1)

将整个backend文件夹视为一个包。如果您使用的是遗留Python(Python 2),则需要将__init__.py个文件放在所有文件夹中,以便它们可以作为子包导入。您需要调整导入,然后调整为from backend.components.storage.Esfrom ..components.storage.Es(相对导入)。

然后,因为它是一个包,你会发现你不能进入子文件夹并执行代码。然后,修复程序是使用backend/commands/backup.py模块标记-m从包含python -m backend.commands.backup的文件夹中运行代码(例如backend)。如果需要,您可以稍后通过创建一个setup.py来添加一个入口点,将其变为更漂亮的命令。