2012-06-22 112 views
1

我在從cmdline/console運行python時僅導入python包時遇到問題。但是,使用pydev時,一切似乎都正常。無法導入Python包

我有以下的文件系統......

---MarketData 
    ---Parser 
     ---Parser.py 
     ---__init__.py 
    ---IO 
     ---__init__.py 
     ---MarketSocket.py 

目前,解析器和IO被定義爲Python包(他們有初始化 .py文件,雖然在解析器沒有任何代碼。INIT .py文件。

我試圖運行下面的代碼行MarketSocket.py

from Parser import Parser 

但是,應該在包「Parser」中導入模塊「解析器」,但出現以下錯誤。

ImportError: No Module Named Parser 

任何幫助,將不勝感激!這應該根據stackoverflow的類似問題,但出於一些奇怪的原因,它不是。

回答

2

MarketSocket.py在目錄IO。因此無法找到包裝Parser

解決此問題的最佳方法是相對導入:from ..Parser import Parser但是,如果您啓動腳本,例如:python MarketSocket.py,它們可能不起作用。要使用此功能,您還必須在MarketData目錄中添加__init__.py

如果它不工作延長sys.path這樣的:

import sys 
sys.path.append('../') 

有了這個此外,巨蟒還搜索你想要的路徑。

如果我是你,我也會考慮重組你的項目。在我看來,可執行文件應該(大部分時候)在工作樹的頂部,這也像Python的作品。

+1

這是一個可怕的解決方案。當使用適當的結構時修改路徑是一個不好的解決方案。 –

+0

當然,只要Python不會改變它們有關包的默認行爲,我認爲sys.path幾乎是你的唯一選擇,如果你想使用像'#!/ usr/bin/env python'這樣的東西, 。個人而言,'python -m'不是我的選擇。 –

+0

出於興趣,爲什麼'python -m'不是一個選項?我建議創建一個頂級模塊,以便在這種情況下導入更好的解決方案。 –

0

的MarketSocket.py低於分析器一個水平,因此不能看到它

做到這一點:

import os 
import sys 
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) 
sys.path.append(os.path.dirname(__file__)) 
0

將一個(空的)__init__.py放在MarketData目錄中將使整個事情成爲一個包(並避免醜陋的路徑攻擊)。如果你從包的頂層調用模塊,這應該是正常的。

+0

不幸的是,這不會總是工作。如果他直接執行'MarketSocket.py',他會得到'ValueError:試圖在非包中進行相對導入'。我不明白爲什麼Python開發者會這麼做...... –

+1

在正確的命名空間中調用它:'python -m IO.MarketSocket' –

+0

@DavidHalter對不起,我誤解了你的觀點(儘管我的評論並不正確) 。它工作得很好,因爲它只有一個級別,如果你在MarketData目錄中。真正重要的一點是應該考慮你想要什麼樣的結構以及你如何導入代碼並使用這個包結構。 –

0

您遇到了相對導入問題。只有在父目錄中,您纔有權訪問任何子包/模塊。所以在MarketSocket.py,你需要

從..Parser進口分析器

然後,當你使用-m選項可以運行它,關鍵是你要在頂級目錄運行它。所以在這種情況下, 1)你會去到MarketData的父目錄 2)在該父目錄中運行python -m MarketData.IO.marketSocket