按完整路径导入具有类似内部模块名称的python包

Tza*_*ach 5 python python-import

在我的项目中,我需要从两个不同的完整路径导入两个外部包.

当我只有一个外部软件包时,我添加了它的路径sys.path并且它工作了,我可以为这两个软件包做到这一点但不幸的是两个软件包都有类似的内部模块,所以如果我将它们都添加到sys.path它们中它们将交叉导入每个软件包的内部模块其他.

为了澄清,包的文件夹结构如下所示:

package1\
  __init__.py
  settings.py
  a.py # does 'import settings'

package2\
  __init__.py
  settings.py
  b.py # also does 'import settings'
Run Code Online (Sandbox Code Playgroud)

如何在没有冲突的情况下导入两个包?我尝试过使用imp.load_source但看起来它只能加载文件.

编辑: 当我只有一个包时,我会使用以下代码从中导入:

sys.path.insert(1, "PATH TO PACKAGE1")
from package1 import a
Run Code Online (Sandbox Code Playgroud)

编辑2: 包的目录结构实际上比上面的那个复杂得多,并且包含数百个文件.还有可导入的内部模块,settings.py例如:

package1\
  __init__.py
  settings.py
  internal_module\
    __init__.py
    a.py # does 'import settings'
Run Code Online (Sandbox Code Playgroud)

这意味着我无法假设a.py并且settings.py在同一目录中.

Kob*_*i K 0

我不确定它是否有效,但值得一试。

使用时sys.path.insert(1, "PATH TO PACKAGE1"),它将“PATH TO PACKAGE1”作为查找包的第一个位置。

所以通过这样做:

sys.path.insert(1, "PATH TO PACKAGE1")
sys.path.insert(1, "PATH TO PACKAGE2")
import ....PACKAGE1
import ....PACKAGE2
Run Code Online (Sandbox Code Playgroud)

你会遇到冲突,因为它首先会去查看 PACKAGE2 的位置,因为 PACKAGE2 将是列表中的第一项......

你能试一下吗:

sys.path.insert(1, "PATH TO PACKAGE1")
from Package1 import a as Package1 
sys.path.insert(1, "PATH TO PACKAGE2")
from Package2 import a as Package2 
Run Code Online (Sandbox Code Playgroud)