Python:如何从具有相同名称的包导入子模块?

时间:2013-08-01 12:52:32

标签: python import module

我的项目设置如下:

基础项目

/some_disk/some_folder/
|-- project/
|   |-- package/
|   |   |-- src/
|   |   |   |-- file_a.py
|   |   |   |-- file_b.py

扩展项目

/some_other_disk/some_folder/
|-- project/
|   |-- package/
|   |   |-- src/
|   |   |   |-- file_c.py
|   |   |   |-- file_d.py

然后我有第三个项目,我希望能够同时使用mopdules file_a和file_c。

在第三个项目中,我已经像这样设置了我的Python路径

PYTHONPATH=$PYTHONPATH:/some_disk/some_folder:/some_other_disk/some_folder

然后,要导入文件,我在主模块中有这个:

import project.module.src.file_a
import project.module.src.file_c

但是,这只能让我能够导入其中一个模块,并且另一个模块上找不到模块错误。

我可以使用这个项目结构来完成这项工作吗?或者Python是否只会查看其中一个“主要”模块并考虑如果它不在那里就找不到子模块?

编辑:该项目使用Python 2.6

3 个答案:

答案 0 :(得分:5)

在每个__init__.py目录中创建一个包文件src。它们应包含以下两行。有关详细信息,请参阅this documentation。此解决方案适用于Python 2.6,是规范解决方案。

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

答案 1 :(得分:0)

这将首先在当前目录/标准目录中进行python搜索,对于第二个,python将首先在标准目录之前搜索pathtofile_c。

import project.module.src.file_a  #<--- here it searches some_disk first
sys.path.insert(0,'pathtofile_c') #<--- Changes your PYTHONPATH - inserts some_other_disk before standard directories
import project.module.src.file_c  #<--- here it searches some_other_disk first

这应该可以解决python的困惑。

答案 2 :(得分:-2)

您需要在这些目录中包含 __ init __。py 文件,以便将python视为包而不是普通目录。

请参阅this讨论,详细了解 init .py文件。

注意:我根据与查询海报的讨论删除了不相关的内容,编辑了我以前的答案。