2015-10-07 84 views
0

我正在使用Makefiles進行Python項目。我需要在每個Makefile中包含一些Python配置變量,並且Makefiles可以駐留在項目根目錄下的各個子目錄中(儘管深度不超過一層)。包含用於執行包含的Makefile的路徑

在項目的根,我創建了一個Makefile.inc用,例如,以下內容:

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
VAR1 := $(shell python -c '$(PYSCRIPT)') 

'custommodule的生活該項目的Python的lib目錄內的根,和所有的Makefile文件在包含Makefile.inc的頂層,執行沒有錯誤。

在 '子目錄/ Makefile文件',我有:

include ../Makefile.inc 
echo $(VAR1) 

當我cd subdirectory && make,我收到錯誤:

ImportError: No module named custommodule 

我試圖在「Makefile.inc前面加上Python路徑'(在define PYSCRIPT塊中)包含父目錄,認爲'子目錄/ Makefile'在它自己的路徑中對其父路徑執行'../Makefile.inc',但這也不起作用。

我是否錯過了防止這種情況發生的東西?還是有更好的方法來實現我想要的?

回答

0

怎麼樣一個Makefile.inc有:

ROOTDIR ?= . 

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
export PYSCRIPT 

VAR1 := $(shell PYTHONPATH=$(ROOTDIR) python -c "$$PYSCRIPT") 

subdirectory/Makefile有:

ROOTDIR = .. 
include $(ROOTDIR)/Makefile.inc 

all: 
    echo $(VAR1) 

未經測試。

+0

這不會起作用:您正試圖將一個make變量賦值添加到python腳本中。 – MadScientist

+0

不完全。我添加到由$'(shell ...)'調用python變量賦值執行的python腳本中。 make擴展將在將腳本傳遞給python之前進行。如果您有明確的證據表明它無法正常工作,請解釋原因。 –

+0

當然,'$(ROOTDIR)'將在python被調用之前展開。但是_assignment_將被python解釋,而不是make,因爲你將整個腳本傳遞給'python -c'。你只是將名爲'PYTHONPATH'的Python變量設置爲'.'或'..',這是Python中的語法錯誤,無論如何不會做你想要的。你可以這樣做:'(shell PYTHONPATH = $(ROOTDIR)python -c'$(PYSCRIPT)')'(並將其從腳本中取出)。要獲得明確的證據,只需運行'python -c'PYTHONPATH =。''然後看它失敗... – MadScientist