包含文件的正确方法

时间:2010-08-16 21:28:22

标签: python

我正在尝试保持一个有点组织的目录结构,因为我计划添加越来越多的脚本。所以我想说我有这样的结构:

/src/main.py
/src/db/<all my DB conn & table manipulation scripts>
/src/api/<all my scripts that call different APIs>

我的main.py脚本将包含db&amp ;;的某些类。根据需要api文件夹。我在每个文件夹中都有空白的_____init_____.py文件,因此它们包含在内。但是说我想在api文件夹的脚本中包含db文件夹中的一个类?就像我需要以某种方式支持一个目录?当我有这样的行时,api脚本会失败:

from db.Conn import QADB

我在v2.6。

更新:我尝试了相对导入,但得到了这个吗?

from ..db.Conn import QADB 
     ^ SyntaxError: 
invalid syntax

4 个答案:

答案 0 :(得分:3)

您设置它的方式是创建三个不同的模块 - 这可能是也可能不是您想要做的。如果您想要一个可以管理不同任务的通用模块,您可以按如下方式进行排列:

mymodule
 |- __init__.py
 |--database
 |   |- __init__.py
 |   |- dbclasses.py
 | 
 |--api
 |   |- __init__.py
 |   |- apiclasses.py
 |
 |--other

[etc]

如果你有这样的想要使用API​​和数据库功能,你可以先说:

from mymodule.database.dbclasses import MyDBClass
from mymodule.api.apiclasses import MyAPIClass

注意你的方式:你的顶级“模块”的名称是src(它不是一个模块,因为它没有__init__.py文件。

如果您在顶层模块中使用了许多常用功能(来自任一子模块),您可以将它们包含在顶部__init__.py中,然后只需调用from mymodule import MyDBClass, MyAPIClass

热门__init__.py的内容:

from mymodule.database.dbclasses import MyDBClass
from mymodule.api.apiclasses import MyAPIClass
__all__ = ['MyDBClass', 'MyAPIClass']

答案 1 :(得分:1)

使用相对导入:

from ..db.Conn import QADB

答案 2 :(得分:1)

FWIW,我不喜欢那种结构。将您的结构基于脚本执行的操作。如果要编写调用外部数据库API的脚本,该怎么办?这是在API目录还是db目录中?

是的,使用相对输入作为awesomo建议。

答案 3 :(得分:1)

将所有内容移到一个通用包裹下:

mypkg/main.py
mypkg/db/...
mypkg/api/..

然后使用绝对导入

from mypkg.db.stuff import somestuff

这样你也可以将mypkg分发为鸡蛋。