2014-12-02 6 views
0

Я пытаюсь использовать Popen для запуска Java-программы, которая принимает несколько аргументов, последний из них представляет собой шаблон xml.Python Popen input from variable?

То, что я до сих пор пытается передать значение шаблона через communication(), но, похоже, не работает.

command = [ 
     'java', 
     '-jar', 
     '~/jenkins-cli.jar', 
     '-noKeyAuth', 
     '-s', 
     'docker-host', 
     'create-job', 
     (self.project.project_name+'-'+env) 
    ] 

subprocess.Popen(command, 
       stdin=subprocess.PIPE, 
       stdout=subprocess.PIPE, 
       stderr=subprocess.PIPE 
       ).communicate(input=template.render(template_vars)) 

Я знаю, за то, что значение template.render (template_vars) является правильным, я могу использовать выход из этого вызова функции в командной строке, и она работает отлично, проблема только при прохождении значение для процесса.

Если я запускаю из командной строки следующее, все работает.

java -jar ~/jenkins-cli.jar -noKeyAuth -s jenkins-host create-job test-dev < template.xml 

Есть ли лучший способ отправить вывод template.render (template_vars) в качестве входных данных для процесса?

+0

«последний из них - это шаблон xml», похоже, не правда; похоже, что этот XML-шаблон является stdin программы Java, а не аргументом командной строки. – abarnert

ответ

2

Я не думаю, что ваша проблема - это вход здесь, а скорее аргументы. В частности:

'~/jenkins-cli.jar', 

В командной строке вы получаете бесплатное расширение тильды. Но при использовании subprocess (или вызова exec -family функции из любого языка, subprocess делает), вы должны сделать это вручную, как это:

os.path.expanduser('~/jenkins-cli.jar'), 

Кроме того, вы передаете другое значение для параметра -s ('docker-host' вместо 'jenkins-host'), а для имени проекта ('something-env' вместо 'test-dev'), так что факт, что работа в командной строке не показывает, что ваш код должен работать.


В качестве примечания, если вы пытаетесь отлаживать код, не обращая внимания на стандартный вывод, STDERR и код возврата выглядит довольно глупо. Распечатайте их и посмотреть, что получится, как это:

p = Popen(command, …) 
out, err = p.communicate(input=…) 
print(p.returncode, out, err) 

Или, конечно, не улавливают stdout и stderr в первую очередь, так что они просто печатать на консоли.

+0

Это было ~ то, что было бесполезно для меня, спасибо, что я полностью пропустил мое использование этого. Проблема со мной, говорящая о jenkins-host vs docker-host, была опечаткой с моей стороны, в фактическом коде он указывает URL-адрес моего jenkins master, который я удалял, второй раз, когда он набрал его, я просто испортил и набрал докер, так как я его так много использовал. Спасибо за помощь. –