Как предлагается в комментариях, используйте pexpect
.
См. pexpect на github , официальные документы и , этот удобный питон для начинающих, прохождение по pexpect .
Для примера. Допустим, это ваш x.sh
файл:
#!/bin/bash
echo -n "Continue? [Y/N]: "
read answer
if [ "$answer" != "${answer#[Yy]}" ]; then
echo -n "continuing.."
else
echo -n "exiting.."
fi
Вы можете сделать это:
import os, sys
import pexpect
# It's probably cleaner to use an absolute path here
# I just didn't want to include my directories..
# This will run x.sh from your current directory.
child = pexpect.spawn(os.path.join(os.getcwd(),'x.sh'))
child.logfile = sys.stdout
# Note I have to escape characters here because
# expect processes regular expressions.
child.expect("Continue\? \[Y/N\]: ")
child.sendline("Y")
child.expect("continuing..")
child.expect(pexpect.EOF)
print(child.before)
Результат скрипта python:
Continue? [Y/N]: Y
Y
continuing..
Хотя я должен сказать, что немного странно использовать pexpect со скриптом bash, если у вас есть возможность его редактировать. Было бы проще отредактировать скрипт так, чтобы он больше не запрашивал:
#!/bin/bash
echo -n "Continue? [Y/N]: "
answer=y
if [ "$answer" != "${answer#[Yy]}" ]; then
echo "continuing.."
else
echo "exiting.."
fi
Тогда вы можете просто использовать subprocess
для его выполнения.
import os
import subprocess
subprocess.call(os.path.join(os.getcwd(),"x.sh"))
Или, если вы хотите вывод в виде переменной:
import os
import subprocess
p = subprocess.Popen(os.path.join(os.getcwd(),"x.sh"), stdout=subprocess.PIPE)
out, error = p.communicate()
print(out)
Я понимаю, что это может быть невозможно для вас, но это стоит отметить.