导入语句继续失败

Import statement continues to fail

我需要一些帮助来找出导入错误。

这是我的 python 项目的目录结构。

├── files  
│   ├── dictionary_files  
│   │  
│   └── transcripts  
├── src  
│   ├── package1  
│   │   ├── adapt_dictionary.py  
│   │   ├── adapt_dictionary.pyc  
│   │   └── __init__.py  
│   ├── package2  
│   └── subtitle.py  
└── test  
    ├── logs  
    │   └── error_log_dict.txt  
    ├── test1.py  
    └── test2.py  

问题来了。文件 test1.py 是我为 adapt_dictionary.py 编写的测试套件。在 adapt_dictionary.py 我有一个 class 叫做 D_bot.

class D_bot:
    def __init__(self):

我正在尝试将此 class 导入我的 test1.py 文件。

import sys
import import sys
sys.path.append("/home/andy/Documents/Projects/AI_Subs/src/package1")
from adapt_dictionary import D_Bot

控制台输出 cannot import name D_Bot。不确定发生了什么。我尝试了一些东西。

我的 python 路径在我的 .bashrc 文件中给出如下。

export PYTHONPATH=${PYTHONPATH}:/home/andy/Documents/Projects/AI_Subs/src/package1

仍然没有运气。我是 运行 python 2.7.6,但我没有想法。

首先,你写的sys.path.append行是错误的。如果你想导入包中的文件,你应该添加包含包的目录,然后从包中导入文件:

import sys
sys.path.append("/home/andy/Documents/Projects/AI_Subs/src")
from package1.adapt_dictionary import D_Bot

您可能认为添加 src/package1 和使用 import adapt_dictionary 等同于上面的内容:它不是

  • 如果您的 PYTHONPATH 中有不同的 adapt_dictionary 文件,它们可能会被导入,而不是从包中导入
  • 此外,在某些情况下 是否从包中导入模块很重要(例如,如果您使用 pickle 模块,您必须在您的导入否则代码中断)。

此外,您正在尝试修复错误的错误。解释器 确实 导入了 adapt_dictionary 模块,但是它找不到 D_bot class。参见:

$mkdir package1
$touch package1/__init__.py
$echo 'class X: pass' > package1/a.py
$echo 'from package1.a import X
> from package1.a import Y' > test1.py
$python test1.py 
Traceback (most recent call last):
  File "test1.py", line 2, in <module>
    from package1.a import Y
ImportError: cannot import name Y
$echo 'from package1.b import X' > test2.py
$python test2.py 
Traceback (most recent call last):
  File "test2.py", line 1, in <module>
    from package1.b import X
ImportError: No module named b

请注意您的错误与第一个错误而不是第二个错误有何相似之处? 第一个出现是因为 a.py 存在 但不包含 Y class.

您可能在某处有一个 adapt_dictionary.py 模块,而解释器正在导入那个模块,或者周围可能有一些过时的 .pyc

另外,adapt_dictionary是模块的实际名称吗?我见过很多次人们在使用与内置文件相同的名称调用实际文件时使用虚构名称发布代码,在这种情况下 import 更喜欢内置文件。

尝试做:

import sys
sys.path.append("/home/andy/Documents/Projects/AI_Subs/src/package1")
import adapt_dictionary
print(adapt_dictionary.__file__)

检查导入了哪个模块。