2017-02-22 3 views
-1

Есть приложение, которое моя компания написала (небольшое приложение для создания шаблонов CloudFormation) и передала двоичный код для всех команд, которые будут использоваться.Python wrapper для передачи аргументов bash

При попытке автоматизировать это немного, я написал сценарий Python, который в основном передает аргументы команде Bash/Shell. Это оболочка, поэтому я просто делаю это, поэтому я могу перебирать кучу конфигурационных файлов для создания пакетов CloudFormation в AWS.

В скорлупе, я бы

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' лучше, если вы не заботитесь о возврате потоков вывода/ошибок. –

Смежные вопросы