2012-01-09 36 views
1

我得到下面的錯誤/ SMPP /測試/ test_post_upgrade.py:無法導入扭曲的互聯網模塊

Traceback (most recent call last): 
    File "protocols/smpp/test/test_post_upgrade.py", line 1, in <module> 
    from protocols.smpp.proto import * 
    File "/tmp/Wass/protocols/smpp/proto.py", line 1, in <module> 
    from twisted.internet import defer, reactor 
ImportError: No module named internet 

這裏是我的樹:

/tmp/Wass$ tree 
. 
├── __init__.py 
└── protocols 
    ├── __init__.py 
    ├── __init__.pyc 
    └── smpp 
     ├── __init__.py 
     ├── __init__.pyc 
     ├── proto.py 
     ├── proto.pyc 
     └── test 
      ├── __init__.py 
      └── test_post_upgrade.py 

3 directories, 10 files 

這裏的主要內容文件:

/tmp/Wass$ cat protocols/smpp/proto.py 
from twisted.internet import defer, reactor 

/tmp/Wass$ cat protocols/smpp/test/test_post_upgrade.py 
from protocols.smpp.proto import * 

/tmp/Wass$ cat protocols/smpp/__init__.py 
__import__('pkg_resources').declare_namespace(__name__) 

有關信息,我可以通過以下操作之一來解決此問題:

  • 清空protocols/smpp/__init__.py,但是這是整個項目這樣我就可以空這個文件,我的項目將不再運行有用..
  • 重命名protocols/smpp到別的,例如protocols/toto將工作(有變化protocols/smpp/test/test_post_upgrade.pyfrom protocols.toto.proto import *

第二種解決方案是如此混亂的我沒有在我的系統中的任何smpp/proto.py,可能會導致衝突......

這裏的問題進行簡單的表示:

Wass/ 
Wass/__init__.py 
Wass/protocols/ 
Wass/protocols/smpp/ 
Wass/protocols/smpp/__init__.py 
Wass/protocols/smpp/test/ 
Wass/protocols/smpp/test/__init__.py 
Wass/protocols/__init__.py 

Wass/protocols/smpp/test/test_post_upgrade.py: 
> from Wass.protocols.smpp.proto import SMPPClientProtocol 

Wass/protocols/smpp/proto.py 
> from twisted.internet import defer, reactor 
> 
> class SMPPClientProtocol: 
>  pass 

執行結果:

$ echo $PYTHONPATH 
:/opt/smpp.twisted/:/opt/smpp.pdu/:/tmp/Wass/ 
python /tmp/Wass/protocols/smpp/test/test_post_upgrade.py 
> Returns the same problem above 
+0

「python -c'import twisted; print twisted .__ file__'」的輸出是什麼? – 2012-01-10 13:39:18

回答

1

有許多這裏的潛在問題。

  1. Wass真的應該是一個包,還是它是一個條目sys.path?如果它真的是一個包裝,你應該添加/tmp到你的PYTHONPATH;如果是路徑條目,則應該將/tmp/Wass添加到PYTHONPATH,並刪除/tmp/Wass/__init__.py*
  2. 請勿直接在層次結構中的模塊上運行python。它混淆了這個問題。
  3. 如果Wass將繼續是一個包(即包含__init__.py),則應該將導入調整爲from Wass.protocols.smpp.proto import ...。請使用import *。這只是令人困惑;有人讀你的代碼不知道什麼名字應該來自哪個模塊。
  4. 嘗試儘可能簡化此操作,並上傳導致問題的一組文件的一個complete, runnable example。由於我不知道這些.py文件裏面有什麼,我必須猜測原因。

最後,我認爲你所看到的問題是由一個名爲protocols一個頂層模塊,與內扭曲的幾個模塊衝突的組合,並使用import *這可能是在另外一個名字引起的拉如basicsmtppop3進入該名稱空間並與某些事物發生衝突,那麼名稱空間包的魔力就會與它結合以創建爆炸。沒有看到引發問題的實際代碼,我不能更具體。

每當遇到類似這樣的問題時,最好後退一步,確保工作目錄,腳本目錄和PYTHONPATH全部分開,以便您確切知道如何導入代碼。具體來說,我建議做這樣的事情:

$ cd /tmp 
$ mkdir runstuff 
$ cd runstuff 
$ PYTHONPATH=/tmp/Wass trial protocols 

希望這會爲你更好地工作。

+0

我已經更新了問題,因爲評論不支持格式化(因爲它似乎..) – 2012-01-10 00:04:51

+0

感謝您的指導!實際上,打印扭曲的.__文件___指出我這是衝突的導入。它已通過absolute_import解決 – 2012-01-10 22:33:23