在我的项目中,我需要从两个不同的完整路径导入两个外部包。在
当我只有一个外部包时,我将它的路径添加到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
和{
我不确定这是否行得通,但值得一试。在
使用
sys.path.insert(1, "PATH TO PACKAGE1")
时,它将“PACKAGE1的路径”作为查找包的第一个位置。在因此,通过:
由于PACKAGE2将是列表中的第一个项,因此它首先将查找PACKAGE2的位置,因此您将发生冲突。。。在
你能试试:
^{pr2}$如果在package1/a.py中导入设置,python将查找设置.py第一个在当前控制器中,即package1和not package2,即使它们都在搜索路径. 因此,即使您导入为(基于上面所示的目录结构),假设您在中添加了pacakge1和package2搜索路径公司名称:
这将不会有任何问题,a.py将从package1导入settings模块,b.py将从package2导入设置。在
如果package1和package2中有同名的模块,那么导入的好方法是
^{pr2}$现在,您可以访问package1\u settings和package2\u settings中的变量
如果将绝对路径添加到“package1”和“package2”添加到搜索路径公司名称:
在系统路径追加(操作系统路径.abspath(“package1”))之类的
我做了一个小实验:
包结构是:
a.py
b.py公司
包装1。设置.py在
包装2。设置.py在
在测试.py在
“python”的输出测试.py““
编辑 对于这种情况,最好的做法是
您将向系统路径并参考你从他们那里进口的东西。在
这样可以确保导入路径不会相互冲突。另一个好处是你的包的可移植性。明天,如果您决定更改package1的位置,那么package1中的所有代码都将正常工作,因为您的所有导入都是从package1引用的。在
听起来您的包已损坏,应该使用相对导入:
package1/a.py
:相关问题 更多 >
编程相关推荐