Передача строки из Python в скрипт Bash с использованием подпроцесса

#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])