2017-02-22 85 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'会更好。 –