【问题标题】:Python wrapper to pass arguments to bash将参数传递给 bash 的 Python 包装器
【发布时间】:2017-07-13 02:30:22
【问题描述】:

我公司编写了一个应用程序(一个用于创建 CloudFormation 模板的小应用程序)并将二进制文件传递给所有团队使用。

为了稍微自动化这一点,我编写了一个 Python 脚本,它基本上将参数传递给 Bash/Shell 命令。这是一个包装器,所以我只是在制作它,以便我可以迭代一堆配置文件以在 AWS 中创建 CloudFormation 堆栈。

在 shell 中,我会这样做

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% 并将参数组合在字符串末尾的 tuple 中...更好:使用带有参数列表的 subprocess 模块,不要尝试创建自己的命令行。
  • tuple 很有意义 - 谢谢@Jean-FrançoisFabre
  • 不确定我是否遗漏了什么,但你有理由不只使用所有 bash 吗?

标签: python bash shell command-line-arguments


【解决方案1】:

改用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'

【讨论】:

  • 为什么使用 subprocess 而不是 optparse?它确实看起来更好 - 只是好奇。
  • @Claudiu: subprocess.check_call 如果您不关心检索输出/错误流,会更好。
  • 啊,我误会了。好的。我使用的是 os.system,但我将切换到 Subprocess。谢谢。
猜你喜欢
  • 2017-06-05
  • 2018-12-04
  • 2012-12-29
  • 2013-04-24
  • 2019-09-22
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多