2017-02-22 153 views
-1

我的公司寫了一個應用程序(一個創建CloudFormation模板的小應用程序)並傳遞了二進制文件供所有團隊使用。Python封裝將參數傳遞給bash

在試圖自動化這一點,我寫了一個Python腳本,基本上傳遞參數到Bash/Shell命令。這是一個包裝,所以我只是做這個,所以我可以遍歷一堆配置文件來在AWS中創建CloudFormation堆棧。

殼,我會做

cfapp cfn create -p Namespace=namespace -p Env=env -p Team=team -p Region=region --spec-file file://partner/foobar.yaml

我用Python寫的,但我得到一個語法錯誤:

os.system("cfapp cfn create -p Pool=%s" % pool "-p Namespace=%s" % namespace "-p Env=%s" % env "-p Team=%s" % team "-r %s" % region "--spec-file file://partner/"+str(config)+".yaml") time.sleep(5)

我看,這是如何通過做python雖然,obv,我的實現是錯誤的。

+1

只使用百分之一和組參數一起在'元組'在字符串的末尾......更好:使用具有參數列表的'subprocess'模塊,不要嘗試自己創建命令行。 –

+0

ah'tuple'很有意義 - 謝謝@ Jean-FrançoisFabre –

+0

不知道我是否錯過了一些東西,但是有沒有理由不使用所有bash? – grail

回答

3

使用subprocess代替:

subprocess.check_call([ 
    "cfapp", "cfn", "create", 
    "-p", "Namespace=%s" % namespace, 
    "-p", "Env=%s" % env, 
    "-p", "Team=%s" % team, 
    "-p", "Region=region", 
    "--spec-file", spec_file, 
]) 

在你的初始誤差的條款,您的字符串格式化語法不正確:

>>> pool = "foo" 
>>> namespace = "bar" 
>>> "cfapp cfn create -p Pool=%s" % pool "-p Namespace=%s" % namespace 
    File "<stdin>", line 1 
    "cfapp cfn create -p Pool=%s" % pool "-p Namespace=%s" % namespace 
                ^
SyntaxError: invalid syntax 
>>> "cfapp cfn create -p Pool=%s -p Namespace=%s" % (pool, namespace) 
'cfapp cfn create -p Pool=foo -p Namespace=bar' 
+0

爲什麼子過程而不是optparse?它看起來更好 - 只是好奇。 –

+1

'optparse'不運行進程... –

+2

@Claudiu:如果您不關心檢索輸出/錯誤流,'subprocess.check_call'會更好。 –