按完整路径导入具有类似内部模块名称的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
实际上包含更多的模块和子包,以及许多包内导入。我会更新这个问题。