Python: выполнение оболочки script с аргументами (переменной), но аргумент не читается в оболочке script

Я пытаюсь выполнить оболочку script (не команда) из python:

main.py
-------
from subprocess import Popen

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True)

execute.sh
----------

echo $1 //does not print anything
echo $2 //does not print anything

var1 и var2 - это некоторая строка, которую я использую в качестве входа в оболочку script. Я что-то упустил или есть другой способ сделать это?

Refered: Как использовать подпроцесс popen Python

Ответ 1

Проблема заключается в shell=True. Удалите этот аргумент или передайте все аргументы в виде строки:

Process=Popen('./childdir/execute.sh %s %s' % (str(var1),str(var2),), shell=True)

Оболочка передаст только аргументы, которые вы предоставили в 1-м аргументе Popen для процесса, так как он интерпретирует сами аргументы. См. Похожий вопрос здесь. Фактически, ваша оболочка script не получает аргументов, поэтому $1 и $2 пустые.

Popen наследует stdout и stderr из python script, поэтому обычно нет необходимости предоставлять аргументы stdin= и stderr= для Popen (если вы не запустите script с перенаправлением вывода, например >). Вы должны сделать это, только если вам нужно прочитать результат внутри python script и каким-то образом манипулировать им.

Если вам нужно только получить результат (и не против синхронного запуска), я бы рекомендовал попробовать check_output, так как легче получить вывод, чем Popen:

output = subprocess.check_output(['./childdir/execute.sh',str(var1),str(var2)])
print(output)

Обратите внимание, что check_output и check_call имеют те же правила для аргумента shell= как Popen.

Ответ 2

вы действительно отправляете аргументы... если ваша оболочка script написала файл вместо печати, вы увидите его. вам нужно связаться, чтобы увидеть ваш печатный результат из script...

from subprocess import Popen,PIPE

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True,stdin=PIPE,stderr=PIPE)
print Process.communicate() #now you should see your output