2015-06-25 69 views
1

我需要一些幫助來計算導入錯誤。導入語句繼續失敗

這是我的一個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

首先,你寫的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類。請參閱:

$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__) 

檢查哪個模塊得到了進口。

+0

是的。我意識到我的錯誤是非常微不足道的,因爲我正在導入D_Bot,但是該類被定義爲D_bot。儘管如此,我對導入包而不是文件本身有了很好的瞭解,所以謝謝!其實,我對一般的進口產品有了一些很好的見解! – Convergii