2013-05-29 217 views
3

我正在構建一個庫,該庫將通過pip由其他項目包含。無法從同一項目的bin目錄中導入模塊

我有以下目錄( 'VENV' 是的virtualenv):

project 
    \- bin 
    \- run.py 
    \- myproj 
    \- __init__.py 
    \- logger.py 
    \- venv 

我激活的virtualenv。

在斌/ run.py我:

from myproj.logger import LOG 

,但我總是得到

ImportError: No module named myproj.logger 

從 '項目' 目錄下面的工作:

python -c "from myproj.logger import LOG" 

這不是在從'bin'目錄中調用時,正確地將'project'目錄添加到pythonpath中。如何從我的bin目錄中的腳本中導入'myproj'的模塊?

回答

5

最簡單的解決方案是將父文件夾追加爲導入上方的可搜索路徑。

import sys,os 
sys.path.append(os.path.abspath('..')) 
from myproj.logger import LOG 
+0

好的謝謝。我以前從未見過。 – user1491250

+2

鑑於OP使用virtualenv; 'sys.path'操作是[不必要](http://stackoverflow.com/a/16816683/4279)甚至[有害](http://stackoverflow.com/a/14186074/4279)。 – jfs

+1

我更喜歡使用腳本中的絕對路徑,因此腳本可以從任何地方運行。 'sys.path.append(os.path.join(os.path.dirname(sys.argv [0]),'..'))' –

0

只有當前工作目錄位於PYTHONPATH中,該目錄用於解決依賴關係。所以,如果你在bin裏面並執行你的腳本,那麼項目就不在路徑中了。您必須使用其中一種常用方法將項目添加到PYTHONPATH,方法是追加到環境變量或通過編程方式編輯sys.path列表,如其他答案中所示。

6

myproject安裝到venv virtualenv;那麼您將可以從任何腳本(包括bin/run.py)導入myproject,同時在沒有sys.path黑客的情況下激活環境。

要安裝,爲myproject包創建project/setup.pyproject目錄中運行,而virtualenv中處於活動狀態:

$ pip install -e . 

它將安裝myproject就地(在myproject模塊的變化是立即可見而不需要重新myproject) 。

+1

鑑於OP正在使用virtualenv,這應該是接受的答案。 – kkurian

0

在PYTHONPATH中添加項目的路徑

相關問題