Python 导入错误:无法导入名称

3 投票
2 回答
8558 浏览
提问于 2025-04-18 09:07

我遇到了一个奇怪的问题,虽然我对Python还很陌生。这个问题看起来和很多论坛上说的有点不同。

Directory structure:

Project_Folder
 -- Folder A 
 -- SubFolder A1
 -- Subfolder A2 
 -- Subfolder A3 
      -- Folder A3-1 
         -- XYZ.py 
 -- Subfolder A4 ( this contains utility classes)
       -- A4-1.py
       -- A4-2.py

注意:所有文件夹里都有一个叫__init__.py的文件,而且PYTHON PATH里包含了所有需要的目录。

脚本XYZ.py依赖于下面两个工具类。脚本一开始会把子文件夹A4添加到sys.path中,所以理论上不需要用A4.A4-1.py来导入,直接用A4-1就应该可以了。像这样: from A4-1.py import sub-methods from A4-2.py import sub-methods

但是这样会出现问题,正如标题所说的那样。不过,如果我用A4.A4-1.py就没问题。

奇怪的是,同样的脚本在项目已经设置好的服务器上可以正常工作。

作为一个Python新手,我想弄明白如何在本地机器上执行这个脚本。(不改变或使用模块名来导入)

另外,我使用的是IDE IntelliJ,我已经把A4添加为项目的依赖项。编译器能够解析它,但执行时却抛出了导入错误……

任何帮助都非常感谢。

2 个回答

1

这些文件真的叫 A4-1.py 吗?因为这样会让我遇到语法错误,而不是导入错误;看起来在模块名称中是不允许使用 - 符号的。这是有道理的,因为它表示减号。

如果你是在同一个项目中导入,我个人觉得大多数情况下,像这样导入

from A4.A4_1 import submethods

比把 A4 加到你的路径中,然后直接从 A4_1 导入要好。

编辑

你能试试看如果解决了 .. 后你的路径是否有效吗?

import sys,os,time,datetime
testdir = os.path.dirname(os.path.abspath(__file__))
newdir = os.path.abspath(os.path.join(testdir, '../../utilities'))
sys.path.append(newdir)

如果不行,你能确认一下使用

print sys.path

是否包含了正确的绝对路径吗?

编辑2

如果你在检查 sys.path,也要确保没有其他目录与导入的开头部分匹配,但没有包含后面的部分(例如 submethods)。如果有另一个目录叫 A4,可能 Python 用的是错误的那个。

还要确保这个名字不是一个已经存在的 Python 模块。(例如,如果你重命名你的模块,导入的第一部分仍然可以正常工作)。

2

这个问题现在解决了,原因是PYTHONPATH中有一些相似的文件夹发生了冲突。有一个路径是存在的,但是里面没有任何文件……在我把那个路径删掉之后,它就开始在正确的路径上寻找工具文件了……

撰写回答