2015-11-19 3 views
1

В качестве последующих мер в мой предыдущий вопрос, который был решен быстро, я бегу код Python ниже WinPython:функция Python subprocess.check_output возвращает CalledProcessError: команда возвращает ненулевое состояние выхода

import os, subprocess 
os.chdir("C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/") 
logtoolDir="C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/ " 
#processEnv = {'JAVA_HOME': 'C:/Program Files/Java/jdk1.8.0_66/'} 
args = r'"org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput.data"' 
subprocess.check_output(['mvn', 'exec:exec', '-Dexec.args=' + args], 
          shell = True, cwd = logtoolDir) 

И получить следующее сообщение об ошибке:

CalledProcessError: Command '['mvn', 'exec:exec', '-Dexec.args="org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput.data"']' returned non-zero exit status 1 

Апач Maven исполнимый, кажется, не работать. Я предполагаю, что аргументы передаются в программу некорректно. Я не мог найти никаких опечаток в аргументах или logtoolDir, но, может быть, я чего-то не хватает? Есть идеи?

UPDATE: mvn exec: exec не был запущен, так как check_output каким-то образом не смог получить доступ к переменным среды Windows. Я добавил путь к processEnv и теперь 'mvn','--version' в check_output args подтверждает, что Maven работает. Код все еще не работает, но я думаю, что это, вероятно, проблема с тем, как я определил каталоги.

Cheers.

+1

IIRC, если вы используете 'shell = True', обычно вы передаете args как одну строку. – mgilson

+0

(также, никогда не используйте 'shell = True' по какой-либо причине.) – geoffspear

+0

@Wooble - это утверждение может быть _bit_ strong :-). Бывают моменты, когда это удобно. Однако любой код, который использует его, должен _clearly_ документировать, что входные данные должны быть на 100% надежными. – mgilson

ответ

0

Проблема решена. В основном: a) subprocess.check_output не смог прочитать переменные среды Windows (например, PATH, JAVA_HOME), поэтому мне пришлось переопределить ту, которую я использовал в processEnv, и передать ее в аргументах функции. Кроме того, b) переменная args определена неверно. Мне нужно было удалить один набор кавычек, а также сделать его необработанным, используя r.

Исправленный код:

logtoolDir='C:/Users/Mohammad/Google Drive/PhD/Spyder workspace/production-consumption/logtool-examples/' 
processEnv = {'JAVA_HOME': 'C:/Program Files/Java/jdk1.8.0_66/jre/', 
      'Path' : 'C:/Program Files/apache-maven-3.3.3/bin/'} 
args = r"org.powertac.logtool.example.ProductionConsumption D:/PowerTAC/Logs/2015/log/powertac-sim-1.state testrunoutput2.data" 
print(subprocess.check_output(['mvn', 'exec:exec', '-Dexec.args='+ args], 
          shell = True, env = processEnv, cwd = logtoolDir)) 

К сожалению, я не могу найти способ обойти, используя shell = True аргумент, который, вероятно, не будет проблемой, так как это будет использоваться только для анализа данных.

Cheers.

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