Обычно, когда у меня возникают проблемы с аргументами при запуске программы из java / python / et c. Я обертываю команду, которую хочу использовать, в sh -c
, например так:
sp.Popen(['/bin/sh', '-c', "mvn exec:java -D\"exec.mainClass\"=\"org.matsim.project.MatsimRun\""])
Вышеприведенное, кажется, работает правильно для меня. Имейте в виду, что это может иметь последствия для безопасности, убедитесь, что команда, введенная в качестве третьего параметра sh
, никогда не подключается к inte rnet hate.
Хорошо, теперь почему ваш код не работает?
python документы говорят, что shell=True
эквивалентно:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
Итак, хорошая гипотеза состоит в том, что sh
игнорирование arg[1]
и дальнейших аргументов. Вы можете проверить это, выполнив:
<censored>@debian:~$ sh -c echo "sfaklg"
<censored>@debian:~$
Посмотрите, как echo
не получает ожидаемые аргументы. Это согласуется с разными методами / оболочками:
<censored>@debian:~$ dash -c echo "sfaklg"
<censored>@debian:~$ bash -c echo "sfaklg"
<censored>@debian:~$ zsh -c echo "sfaklg"
<censored>@debian:~$ zsh -c echo sfaklg
<censored>@debian:~$ bash -c echo sfaklg
<censored>@debian:~$
Страница man для bash говорит:
Если присутствует опция - c, то команды читать из первого неопционального аргумента command_string. Если после command_string есть аргументы, первый аргумент присваивается $ 0, а все остальные аргументы присваиваются позиционным параметрам. Присвоение $ 0 устанавливает имя оболочки, которое используется в предупреждениях и сообщениях об ошибках.
Другими словами sh -c
предназначено для запуска сценариев оболочки, которые ожидают, что аргументы будут переданы с $1
, $2
, ....
Так что же вам делать?
Подозревается, что вы хотите запустить maven в оболочке, потому что для этого требуется JAVA_HOME
или аналогичные переменные среды, чтобы быть набор. Этот вопрос дает примеры того, как установить / изменить переменные среды, хотя вам все еще может понадобиться shell=True
. В этом ответе также предлагается использовать команду env для переопределения переменных среды.
Наконец, вы можете найти этот вопрос полезным.