我已经将另一个python项目作为git子模块添加到我的项目中,以重用它的功能。 现在在我的项目中,我能够使用具有绝对路径的库
但在这些库中,导入语句现在失败了
所有图书馆都有:
from automation.corelib.BaseApi import BaseAPI
当我将其更改为绝对路径时
from Systemtest.Services.automation.corelib.BaseApi import BaseAPI
这是可行的,但无法做到,因为它将偏离子模块分支,并且无法更改代码
在whileautomation.corelib.BaseApi
它应该执行相对导入,并且在第三方库中没有文件更改的地方,是否有任何解决方法。是必需的
版本:python3.6
结构如下:
----project--- (master branch)
|
------submodule1 (dev. branch)
|
------submodule2 (dev. branch)
|
------Testcase (accessing submodule 1 & 2)
在子模块1和&;中都有同名automation.corelib
的文件夹;2,这还没有得到解决。这两个子模块都添加到sys.path,但只有1起作用,如果在子模块1的自动化文件夹中找不到文件,则不会签入子模块2的自动化文件夹
具有绝对名称&;适当的层次结构,它的工作。但是在子模块中它失败了,并且路径也不能被修改,因为该子模块被其他人使用
这是一个虚拟项目,用于可视化问题
示例_test.py中有2条导入语句:
from automation import dummy_module1
from automation import dummy_module2
一个自动化文件夹位于子模块1中,另一个位于子模块2中。两者的路径都添加到sys.Path中。但只有一个问题得到解决
i am module1
Traceback (most recent call last):
File "C:/Users/Test/PycharmProjects/TestImport/test/sample_test.py", line 2, in <module>
from automation import dummy_module2
ImportError: cannot import name 'dummy_module2'
Process finished with exit code 1
我发现它发现自动化文件夹是submodule1,所以第一个被传递,但在第二个语句中它并没有在submodule2中尝试。有没有办法在不修改import语句的情况下解决这个问题(因为它也是其他项目的一部分)
在import语句中提供父目录时,它可以工作,但在我的场景中不允许
我尝试在运行时修改sample_test.py中的sys.path,但这也不起作用。比如:
import sys
sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule1')
from automation import dummy_module1
sys.path.remove('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule1')
sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule2')
from automation import dummy_module2
当您使用
sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule1')
时,您告诉python导入系统只搜索submodule1
中的文件。这意味着submodule1
本身没有被重新命名为模块。这可能会起作用,但也可能导致将来的错误,这取决于submodule1
在长期内的变化您当前的问题可以通过执行以下操作来解决:
请注意,当使用
我建议您考虑代码重构,以避免这种类型的工作。名称空间是一个很好的特性,用于准确地防止此类问题sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\')
时,Python将把submodule1
和submodule2
都识别为模块,尽管它在前面的语句中还分别识别了submodule1
下的文件。我不确定这会导致什么样的问题相关问题 更多 >
编程相关推荐