导入语句继续失败

时间:2015-06-25 07:52:14

标签: python-2.7 import

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

这是我的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我有一个名为D_bot的课程。

class D_bot:
    def __init__(self):

我尝试将此类导入我的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。不知道发生了什么。我尝试了一些事情。

  • 确保没有循环依赖关系(对此有好处)
  • PYTHONPATH更改为指向类所在的相应目录
  • 弄乱sys.path

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

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

仍然没有运气。我正在运行python 2.7.6并且我没有想法。

1 个答案:

答案 0 :(得分:1)

首先,你写的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等同于上述内容:它不是

  • 如果您的adapt_dictionary中有不同的PYTHONPATH个文件,则可能会导入这些文件而不是包中的文件
  • 此外,在某些情况下,无论模块是否从包中导入,确实都很重要(例如,如果您使用pickle模块,则必须在导入中保持一致,否则代码中断)

此外,您正在尝试修复错误的错误。解释器执行导入adapt_dictionary模块,但找不到D_bot类。参见:

$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类。

您可能在某处有一个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__)

检查导入的模块。