#python #python-3.x #bash #unix #subprocess
#python #python-3.x #bash #unix #подпроцесс
Вопрос:
Мне был предоставлен скрипт bash, который перебирает группу каталогов и запрашивает ввод (y / n) для каждого каталога.
Я использую модуль подпроцесса Python для запуска кода из записных книжек Jupyter, и у меня есть
def run_shell(cmd):
popen = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)
for line in popen.stdout:
print(line)
if 'User/Documents' in line:
directory = line.split()[-1]
if 'Do the input' in line:
print('Inputting')
response = my_function(directory) # response = 'y' or 'n'
inp = popen.communicate(input=response)[0] # option 1 i tried
popen.stdin.write(response) #expects a bytes type object # option 2 i tried
popen.communicate()[0]
popen.stdin.close()
popen.stdout.close()
return_code = popen.wait()
if return_code:
raise subprocess.CalledProcessError(return_code, cmd)
run_shell(my_command)
Сценарий bash выглядит примерно так, как показано ниже:
for directory in $directory_list
do
echo /User/Documents/${directory}
echo Do the input
read -p 'Enter y or n ' decision
done
Даже без попытки дать ответ через communicate он никогда не напечатает строку «Введите y или n».
Скрипт также вычисляет файлы, необходимые для принятия решения, поэтому входные данные y и n не могут быть предварительно вычислены и переданы с вводом в подпроцессе.Popen.
Большое спасибо
Комментарии:
1. он никогда не напечатает строку «Введите y или n». это ожидаемое поведение, если stdin не является терминалом, для которого bash не отображает приглашение
read
.
Ответ №1:
Вы можете вызвать .sh
скрипт и передать ему аргументы следующим образом:
subprocess.check_output(['sh', './script.sh', arg1, arg2, arg3])