导入具有类似名称的内部模块的python软件包,通过完整路径

2024-05-28 23:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当我只有一个外部包时,我将它的路径添加到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_source,但它看起来只能加载文件。在

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

^{pr2}$

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

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

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


Tags: 模块文件path项目pyimport路径目录
3条回答

我不确定这是否行得通,但值得一试。在

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

因此,通过:

sys.path.insert(1, "PATH TO PACKAGE1")
sys.path.insert(1, "PATH TO PACKAGE2")
import ....PACKAGE1
import ....PACKAGE2

由于PACKAGE2将是列表中的第一个项,因此它首先将查找PACKAGE2的位置,因此您将发生冲突。。。在

你能试试:

^{pr2}$

如果在package1/a.py中导入设置,python将查找设置.py第一个在当前控制器中,即package1和not package2,即使它们都在搜索路径. 因此,即使您导入为(基于上面所示的目录结构),假设您在中添加了pacakge1和package2搜索路径公司名称:

from package1 import a
from package2 import b

这将不会有任何问题,a.py将从package1导入settings模块,b.py将从package2导入设置。在

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

^{pr2}$

现在,您可以访问package1\u settings和package2\u settings中的变量

package1_settings.var1
package2_settings.var1

如果将绝对路径添加到“package1”和“package2”添加到搜索路径公司名称:

在系统路径追加(操作系统路径.abspath(“package1”))之类的

我做了一个小实验:

包结构是:

package1
    __init__.py
    a.py
    settings.py

package2
    __init__.py
    b.py
    settings.py

test.py

a.py

import settings

def print_a():
    print settings.a

b.py公司

import settings

def print_a():
    print settings.a

包装1。设置.py在

a = "settings.py in package1"

包装2。设置.py在

a = "settings.py in package2"

在测试.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”的输出测试.py““

>>> python test.py
settings.py in package1
settings.py in package2

编辑 对于这种情况,最好的做法是

Always reference your imports from your top level package

您将向系统路径并参考你从他们那里进口的东西。在

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

相关问题 更多 >

    热门问题