如果不同目录下的包名称相同,Python导入语句无法解析

2024-05-15 20:51:11 发布

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

我已经将另一个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的自动化文件夹

具有绝对名称&;适当的层次结构,它的工作。但是在子模块中它失败了,并且路径也不能被修改,因为该子模块被其他人使用

这是一个虚拟项目,用于可视化问题

sample project structure

示例_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

Tags: 模块path项目fromtestimport文件夹sys
1条回答
网友
1楼 · 发布于 2024-05-15 20:51:11

当您使用sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule1')时,您告诉python导入系统只搜索submodule1中的文件。这意味着submodule1本身没有被重新命名为模块。这可能会起作用,但也可能导致将来的错误,这取决于submodule1在长期内的变化

您当前的问题可以通过执行以下操作来解决:


import sys
# Tells Python to look for `automation` under the directory `submodule1`, 
# thus making the `from automation import dummy_module1` to work
sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\submodule1')

# Tells Python to look for `submodule2` under the directory `TestImport`, 
# thus making `from submodule2.automation import dummy_module2` to work.
sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\')

from automation import dummy_module1
from submodule2.automation import dummy_module2

请注意,当使用sys.path.append('C:\\Users\\Test\\PycharmProjects\\TestImport\\')时,Python将把submodule1submodule2都识别为模块,尽管它在前面的语句中还分别识别了submodule1下的文件。我不确定这会导致什么样的问题

我建议您考虑代码重构,以避免这种类型的工作。名称空间是一个很好的特性,用于准确地防止此类问题

相关问题 更多 >