2015-02-09 4 views
1

Я пытаюсь написать сценарии Python для выполнения некоторых команд Maven автоматически.Как заставить Maven работать с подпроцессом Python?

Следующий код Python не работает:

import subprocess 
args = ['mvn', '-version'] 
process = subprocess.Popen(args, stdout=subprocess.PIPE) 

в результате следующей ошибки:

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    process = subprocess.Popen(args, stdout=subprocess.PIPE) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

В качестве следующего шага, я поставляю подпроцесс полного пути к mvn двоичным:

import subprocess 
args = ['/usr/local/Cellar/maven/3.2.3/libexec/bin/mvn', '-version'] 
process = subprocess.Popen(args, stderr=subprocess.PIPE) 
out, err = process.communicate() 

Эта команда получает немного дальше, но печать err раскрывает следующую жалобу:

Error: JAVA_HOME is not defined correctly. 
    We cannot execute /usr/libexec/java_home/bin/java 

В качестве проверки вменяемости, я проверить на собственном терминале, JAVA_HOME правильно установить:

$ mvn -version 
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T16:58:10-04:00) 
Maven home: /usr/local/Cellar/maven/3.2.3/libexec 
Java version: 1.8.0_25, vendor: Oracle Corporation 
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac" 

Я также возможность запускать mvn без хлопот на терминале.

Мой вопрос: почему подпроцесс не может работать mvn, и как я могу его получить?

+1

Хм ... Кажется, что окружающая среда должна быть унаследован от вызывающего абонента. Можете ли вы проверить значение 'os.environ ['JAVA_HOME']'? – mgilson

+0

Кроме того, я не уверен, что это имеет значение, но по какой-то причине JAVA_HOME, подразумеваемая в ошибке, и дом Java из вашей «проверки работоспособности», по-видимому, являются разными путями ... – mgilson

+0

@mgilson 'os.environ [' JAVA_HOME '] 'не определено, но, явно определяя его в Python, теперь работает вызов подпроцесса' mvn'. – user3898238

ответ

1

Python наследует среду от вашего терминала, а подпроцесс, порожденный Python, должен наследовать среду от родительского процесса. Поэтому я не знаю, откуда исходит ошибка в отношении вашей переменной JAVA_HOME. Может быть, вы не порождаете Python с того же терминала, что и с тестом mvn -version?

Обратите внимание, что вы можете явно изменить среду для ребенка с помощью параметра env до Popen().

+0

Я сделал сценарии подпроцесса, которые запускают банки, и у них не было проблем с использованием 'java' без явного определения параметра' env'. Мне интересно, что может вызвать эту проблему с помощью 'mvn', поскольку я все еще использую полный путь к двоичному. – user3898238

+0

Я вижу, что контроль над окружающей средой помог решить вашу проблему. Поскольку я предложил, что вы, возможно, захотите дать мне хотя бы минимум ;-). –

2

Использование

process = subprocess.Popen(args,shell=True) 
+1

это кажется более подходящим в качестве комментария – MichaelChirico

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