2011-07-27 57 views
2

相對導入在python2.6.5中無法正常工作,正在獲取「ValueError:嘗試在非包中的相對導入」。python2.6.5中的相對導入

我將所有這些__init__.py放在適當的位置。

+1

(1)這是'__init __。py',請確保您有這個權利。 (2)你確定所有'__init__'文件都在正確的位置嗎?請張貼您的目錄結構列表,以便我們幫助指出錯誤。 –

+2

除非您向我們提供目錄結構和違規代碼的概述,否則無法分辨出問題所在。 –

+0

您應該可能顯示您的導入語句和您的目錄結構以獲得幫助...... – Constantinius

回答

2

我在運行裏面的腳本時發現有錯誤,其中包含包。對於口譯員來說,看起來好像包裝不是包裝。

嘗試將腳本帶入另一個目錄,將您的軟件包放入您的pythonpath中,並完全導入。然後,你的包內的相對導入將會起作用。注意:您仍然可以在最終腳本內部不進行相對導入 - 在這種情況下最簡單的做法是製作一個「包裝器」腳本,它只需調用包中的某個入口點即可。

您可以通過使用setuptools爲您的包創建一個setup.py以使其可分發,從而可以更進一步。然後,作爲其中的一部分,entry points將允許您自動生成調用您的程序包代碼的腳本。

編輯

從您的評論,看起來好像我不太清楚。我不是100%確定你的目錄結構,因爲您的評論上面沒有格式化,但我把它是這樣的:

PythonEvent/ 
    main.py 
    __init__.py 
    DBConnector/ 
     __init__.py 
     connector.py 
    service/ 
     __init__.py 
     myservice.py 

myservice.py你也行from ..DBConnector.connector import DBUpdate,解釋嘗試導入它相對來說,,除非你直接運行myservice.py。這就是你現在所做的。

嘗試製作的PythonEvent/之外的另一個虛擬腳本,那簡直如下:

from PythonEvent.service import myservice 

if __name__ == '__main__': 
    myservice.main() # or whatever the entry point is called in myservice. 

然後,設置你的PYTHONPATH環境變量指向的PythonEvent/父目錄(或移動PythonEvent/到您的站點包) 。

+0

沒有得到正確..線路有 – user865438

+0

非常感謝...現在它工作正常。 – user865438

0
main.py 
setup.py 
Main Package/ -> 
    __init__.py 
    subpackage_a/ -> 
     __init__.py 
     module_a.py 
    subpackage_b/ -> 
     __init__.py 
     module_b.py 

我)

1.You run python main.py 
    2.main.py does: import app.package_a.module_a 
    3.module_a.py does import app.package_b.module_b 

II)

Alternatively 2 or 3 could use: from app.package_a import module_a 

That will work as long as you have app in your PYTHONPATH. main.py could be anywhere then.

所以你寫一個setup.py複製(安裝),整個應用程序包和子包到目標系統的python文件夾和main.py來定位系統的腳本文件夾。

由於https://stackoverflow.com/a/1083169