Python:如何从同名包导入子模块?

Python:如何从同名包导入子模块?,python,import,module,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 | |

我的项目设置如下所示:

基础项目

/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
扩建项目

/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总是只查看其中一个“主”模块,并考虑子模块在没有的情况下没有找到?


编辑:项目使用Python2.6

您需要在这些目录中包含\uuuu init\uuuu.py文件,以使Python将其视为包而不是普通目录

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
有关init.py文件的更多信息,请参阅讨论


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

您需要在这些目录中包含\uuuuu init\uuuuuuuy.py文件,以使python将其视为包而不是普通目录

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
有关init.py文件的更多信息,请参阅讨论


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

这将使python首先在当前目录/标准目录中搜索,而对于第二个目录,python将首先在标准目录之前的PathToFilec中搜索

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

import project.module.src.file_a#这将使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

import project.module.src.file_a#在每个
src
目录中创建一个包文件
\u init\u.py
。它们应该包含以下两行。有关详细信息,请参阅。此解决方案适用于Python2.6,是规范的解决方案

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

在每个
src
目录中创建一个包文件
\uuuu init\uuuuu.py
。它们应该包含以下两行。有关详细信息,请参阅。此解决方案适用于Python2.6,是规范的解决方案

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

即使您可以欺骗Python,让您拥有两个完全相同名称的不同包,这听起来也不是一个好主意。为什么要这样做?基本上,主项目要大得多,包含大量数据,并且有project.module-layout,而扩展项目更像是“plugin”项目,通过第三个项目可以使用它。将扩展项目作为主项目的一部分也不是一个选项。它以前在Unix中添加过符号链接,但我想去掉它们,因为它们可能无意中被添加到带有VCS系统的主项目中。@Wooble这实际上是一件常见的事情。提问者需要名称空间包。这是一个相关的问题。@Wessie:谢谢,这个链接帮助了我。即使你可以欺骗Python让你有两个完全相同名称的不同包,这听起来是个坏主意。为什么要这样做?基本上,主项目要大得多,包含大量数据,并且有project.module-layout,而扩展项目更像是“plugin”项目,通过第三个项目可以使用它。将扩展项目作为主项目的一部分也不是一个选项。它以前在Unix中添加过符号链接,但我想去掉它们,因为它们可能无意中被添加到带有VCS系统的主项目中。@Wooble这实际上是一件常见的事情。提问者需要名称空间包。这是一个相关的问题。@Wessie:谢谢,这个链接帮助了我。我认为这没有帮助,因为Python不会同时搜索导入文件夹。刚刚更新了原始帖子,使用的是Python2.6。这不是问题,我已经有了_init_uupy.py文件。问题是我有两个同名的包。我认为这没有帮助,因为Python不会同时搜索两个导入文件夹。刚刚更新了原始帖子,使用的是Python2.6。这不是问题,我已经有了_init_uupy.py文件。问题是我有两个同名的软件包。谢谢,成功了!但是,我是否需要将它同时放在基本项目和扩展项目中?一个小小的测试表明,似乎只有当项目在PYTHONPATH中处于第一位时才需要它。将两者都放进去是最安全的。这样,如果你在基本模块之前导入扩展模块,你就不会被咬到。谢谢,这很有效!但是,我是否需要将它同时放在基本项目和扩展项目中?一个小小的测试表明,似乎只有当项目在PYTHONPATH中处于第一位时才需要它。将两者都放进去是最安全的。这样,如果您在导入基本模块之前导入扩展模块,您将不会得到位。