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

按完整路径导入具有类似内部模块名称的python包,python,python-import,Python,Python Import,在我的项目中,我需要从两个不同的完整路径导入两个外部包 当我只有一个外部包时,我将其路径添加到了sys.path中,它起了作用,我可以对两个包都这样做,但不幸的是,两个包都有相似的内部模块,因此如果我将它们都添加到sys.path中,它们将相互交叉导入内部模块 为了澄清,包的文件夹结构如下所示: package1\ __init__.py settings.py a.py # does 'import settings' package2\ __init__.py sett

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

当我只有一个外部包时,我将其路径添加到了
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'
如何导入两个包而不发生冲突? 我尝试过使用
imp.load\u source
,但它似乎只能加载文件

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

sys.path.insert(1, "PATH TO PACKAGE1")
from package1 import a
编辑2: 包的目录结构实际上比上面的要复杂得多,并且包含数百个文件。还有一些内部模块可以导入
设置.py
,例如:

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

这意味着我不能假设
a.py
settings.py
在同一个目录中。

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

当使用
sys.path.insert(1,“到包的路径1”)
时,它将“到包的路径1”作为查找包的第一个位置

这样做:

sys.path.insert(1, "PATH TO PACKAGE1")
sys.path.insert(1, "PATH TO PACKAGE2")
import ....PACKAGE1
import ....PACKAGE2
由于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 

如果在package1/a.py中导入设置,python将首先在当前控制器中查找settings.py,即package1而不是package2,即使它们都在sys.path中。因此,即使您导入为(基于上面显示的目录结构),假设您在sys.path中添加了pacakge1和package2:

from package1 import a
from package2 import b
这将正常工作,a.py将从package1导入设置模块,b.py将从package2导入设置

如果package1和package2中都有同名的模块,那么导入的好方法是

import package1.settings as package1_settings
import package2.settings as package2_settings
现在,您可以访问package1\u设置和package2\u设置中的变量

package1_settings.var1
package2_settings.var1
如果已将绝对路径添加到“package1”和“package2”到sys.path,则所有这些都将起作用:

from package1 import a
from package2 import b
sys.path.append(os.path.abspath(“package1”)#类似的东西

下面是我做的一个小实验:

包结构是:

package1
    __init__.py
    a.py
    settings.py

package2
    __init__.py
    b.py
    settings.py

test.py
a、 派克

b、 派克

package1.settings.py

a = "settings.py in package1"
a = "settings.py in package2"
package2.settings.py

a = "settings.py in package1"
a = "settings.py in package2"
test.py

import sys
import os

dir_name = os.path.abspath(os.path.dirname("__file__"))
package1_path = os.path.join(dir_name, "package1")
package2_path = os.path.join(dir_name, "package2")

sys.path.append(package1_path)
sys.path.append(package2_path)

from package1 import a
from package2 import b

a.print_a()
b.print_a()
“python test.py”的输出

编辑 对于此类情况,良好做法是:

始终引用顶级软件包中的导入

您将把package1和package2添加到sys.path中,并引用从它们导入的所有内容

import package1.settings as package1_settings
import package1.internal_module.a as package1_internal_module_a #give a shorter name
import package1.internal_module.other_module.settings as package1_internal_other_settings

这样可以确保导入路径不会相互冲突。这样做的另一个优点是软件包的可移植性。明天,如果您决定更改package1的位置,则package1中的所有代码都将正常工作,因为您的所有导入都是从package1引用的。

听起来您的包已损坏,应该使用相对导入:

package1/a.py

 from . import settings

如何从项目中的这两个包导入?@praveen当我只有一个包时,我会将其完整路径添加到
sys.path
,然后只需执行
import package1
from package1 import some_internal_module
即可显示导入(代码)?您的包是否有同名的模块?package1/a.py,package2/a.py?是的,它们都有,例如,
settings.py
(它们实际上有更多的共同点)@praventhanks,但这有两个问题:(1)只有在导入它时,
package1
立即导入它的所有内部模块,这才有效,在我的项目中并非如此。(2) 我在项目的不同部分导入了这两个包,有时是并行导入的,所以我无法控制首先导入的是什么。谢谢你的详细回答。如果目录结构如此简单,则您是正确的,但如果
a.py
与settings.py不在同一目录中,则将根据
sys.path
进行解析。正如我几次评论的那样,
package1
package2
实际上包含更多的模块和子包,以及许多包内导入。我会更新这个问题。