我想在我的MacBook上啟動Docker,如果make all從shell運行的話。
我建立了一個python -c命令(如下),它在我的MacBook 超級終端中運行良好:
% python -c $'from subprocess import getstatusoutput
output=getstatusoutput("open --background -a Docker")
if int(output[0])>0:
print("Docker desktop failed to launch: exit-code:{}".format(output[0]))'/span>
由于我還搞不清楚的原因,如果我用它構建一個Makefile,這似乎會失敗(注意:一個tab是四個空格...我在Makefile中使用了tab縮進)。
all:
$(shell python -c $'from subprocess import getstatusoutput!
output=getstatusoutput("open --background -a Docker")
if int(output[0])>0:
print("Docker desktop failed to launch: exit-code:{}".format(output[0]) )')
運行make all目標...
% make all
/bin/sh: -c: 第0行:在意外標記`(附近的語法錯誤。
/bin/sh: -c: 第0行: `python -c from subprocess import getstatusoutput
output=getstatusoutput("open --background -a Docker")
if int(output[0])>0:
print("Docker desktop failed to launch: exit-code:{}".format(output[0]))''
make: `all'是最新的。
%
我一直在糾結這個問題......
。誰能幫助解釋一下為什么make all會失敗,以及解決這個python -c命令的最佳方法? 我的shell CLI python -c ...命令在我的MacBook上成功啟動了Docker桌面。
我知道有一些非python的方法來解決這個具體問題...... 我需要一個通用的python Makefile解決方案。
uj5u.com熱心網友回復:
在Makefile中使用python -c是很棘手的,因為Python的縮進要求。一個簡單的解決方案是,如果你想使用Bash的 "C-style "字串,就使用SHELL=/bin/bash:
SHELL=/bin/bash
all。
# python命令必須用單引號包裹_并且前面有雙美元符號。
python -c $$' from subprocess import getstatusoutput
output=getstatusoutput("open --background -a Docker")
if int(output[0])>0:
print("Docker desktop failed to launch: exit-code:{}".format(output[0]))'/span>
(注意美元符號需要加倍才能轉義。顯然,這限制了你的Makefile在有Bash的系統中的可移植性。$'...' 語法讓你使用轉義代碼,如和。
和 在一個字串中,并讓它們分別擴展為換行和制表符。這種結構特別需要一個領先的美元符號和字串周圍的單引號--僅僅是'...'做了一些稍微不同的事情,而$"..."做了一些完全不同的事情。
你也可以定義一個make多行變數。但是在這種孤立的情況下,Python無論如何都不會扮演任何有用的角色。
all。
open --background -a Docker
make如果open失敗,將以一個錯誤資訊終止;從Python中列印出基本上相同的資訊似乎是多余的。如果你想在出錯的情況下繼續進行,你可以這樣做
all。
open --background -a Docker ||
echo "Docker desktop failed to launch: exit-code: $$?"
......雖然我認為從Python腳本中失敗(原文如此)只是一個錯誤。
uj5u.com熱心網友回復:
我發現了一種在Makefile中嵌入多行python腳本的方法...
將此保存為Makefile...
define MULTILINE_PYTHON_SCRIPT
###########################################
# 在這里開始多行python字串...
###########################################
from subprocess import getstatusoutput as gso
import os
print(" Here we go:")
for test_string in ['Hello World 1', 'Hello World 2', 'Hello World 3'] 。
print(' test_string)
###########################################。
# End of multiline python string...。
###########################################
endef
export MULTILINE_PYTHON_SCRIPT
EMBEDDED_PY := python -c "$MULTILINE_PYTHON_SCRIPT"。
.PHONY:無
沒有什么。
echo "raw makefile command"。
.PHONY: 測驗
測驗。
$(EMBEDDED_PY)
測驗輸出:
% make nothing
echo "raw makefile command"/span>
原始makefile command
%
% make test 。
python -c "$MULTILINE_PYTHON_SCRIPT"。
我們來了。
你好,世界1
你好,世界2
你好,世界3
%
%
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329903.html
標籤:
