模块导入自身时出现属性错误 - 在某些计算机上有效

a20*_*a20 1 python python-module python-import

我继承了一些我正在尝试运行的 python 脚本。其中包括一些自定义模块,在导入其中一个模块时出现错误,这似乎是由于其中一个模块导入自身所致。我觉得奇怪的是它在一台计算机上可以运行,但在另一台计算机上却不能。

目录结构如下:

/path/to/packages/python_packages/x
                              |
/path/to/packages/python_packages/x/mod1.py
/path/to/packages/python_packages/x/mod2.py
/path/to/packages/python_packages/x/mod3.py
Run Code Online (Sandbox Code Playgroud)

我添加(并使用 print(sys.path) 交叉检查)路径,如下所示:

sys.path.append("/path/to/packages/python_packages/")
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

import x.mod1 as mod1
import x.mod2 as mod2
import x.mod3 as mod3
Run Code Online (Sandbox Code Playgroud)

导入 mod1 有效。

导入 mod2 不起作用:

AttributeError: module 'x' has no attribute mod2
Run Code Online (Sandbox Code Playgroud)

Traceback 抱怨 mod2.py 中出现的这一行:

import x.mod2 as mod2
Run Code Online (Sandbox Code Playgroud)

导入 mod3 不起作用,因为它需要导入 mod2,其操作方式与上面相同。

在 ipython 的回溯中,我可以看到它找到了正确的 python 文件,因为它打印出了文件中的代码及其名称、完整路径。

我尝试删除所有init .py 和pycache

我尝试在另一台计算机上运行它,在那里我可以毫无问题地导入模块。

在有问题的计算机上,我有Python 3.6.8,在CentOS7(3.10.0-1160.21.1.el7.x86_64)上运行,在它工作的计算机上,我有Python 3.9.2,在Manjaro(5.4)上运行.108-1-曼贾罗)。

我在出现问题的计算机上没有 root 访问权限。

完整的回溯如下(我更改了路径和文件名以与上面的解释一致):

In [9]: import x.mod2 as mod2
Run Code Online (Sandbox Code Playgroud)
AttributeError                            Traceback (most recent call last)
<ipython-input-9-8c4b062c2395> in <module>
----> 1 import x.mod2 as mod2

/path/to/packages/python_packages/x/mod2.py in <module>
  2 import numpy  as np
  3 
----> 4 import x.mod2 as mod2
  5 
  6 

AttributeError: module 'x' has no attribute 'mod2'
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

无需mod2仅为了访问而导入mod2.__file__,因为它也可以作为__file__.

你应该使用而不是字符串摆弄pathlib

reference_path = Path(__file__).absolute().parents[2] / "reference"
Run Code Online (Sandbox Code Playgroud)

而不是使用asuse from

from x import mod1
Run Code Online (Sandbox Code Playgroud)

或者,因为您已经在同一个包中:

from . import mod1
Run Code Online (Sandbox Code Playgroud)