Как я могу отправить «пользовательский ввод» в скрипт python из другого скрипта python (или выполнить php)? - PullRequest
0 голосов
/ 04 июня 2019

Я создаю сайт, используя php и XAMPP.Этот веб-сайт принимает файл Python от пользователя, затем ему нужно запустить этот файл Python и получить все выходные данные из этого файла.Я был в состоянии сделать это с помощью shell_exec () в файле php.

Проблема заключается в получении пользовательского ввода для файлов Python.В файлах используются функции input () и sys.stdin.readline ().Мне нужно иметь возможность автоматически отправлять Python-файл "пользовательский ввод" (иногда несколько входов).Я точно знаю, что и сколько «пользовательских входов» мне нужно будет отправить, так что это не требует моего вмешательства.

Я думаю, что один из способов сделать это - изменить способ ввода представленных файлов Python.Если бы я мог сделать это, то я бы сохранил каждый вход в списке, который будет повторяться.К сожалению, я не могу отредактировать действительные команды ввода в отправленных файлах, поэтому это должно быть сделано в верхней части отправленного файла python.

Вот как php-файл выполняет файлы python.

$command = "python python_script.py";
$output = shell_exec($command);
echo nl2br($output);

Я попытался использовать функцию эха (с && для нескольких входов), но единственная проблема с этим заключается в том, что функция эха не может нажимать ввод после каждого эха.Это, однако, успешно сопоставило входные данные с подсказками ввода.Ниже приведен пример.python_script.py должен принять ввод, затем распечатать его, но cmd отобразил это:

C:\>(echo 2 && echo 3) | python python_script.py 
number one: 2
number two: 3

C:\>

Теперь я пытаюсь использовать функции подпроцесса в отдельном файле python.Опять же, проблема заключается в «пользовательском вводе»;Я не знаю, как отправить входные данные.Решения подобных проблем не смогли работать для меня, но я уверен, что это из-за моего непонимания функций подпроцесса.

Я думаю, что подпроцесс - мой лучший выбор, но я также буду признателен за любые предложения, использующие php.Я также предпочел бы не создавать пакетный файл для этой проблемы.

1 Ответ

0 голосов
/ 05 июня 2019

Я нашел решение этой проблемы.

Для отправки входных данных из одного файла Python в другой (версия Python 3.7) я использовал три файла.

  1. Файл для запускаподпроцесс
  2. Файл для выходных данных (очень простой)
  3. Файл, требующий ввода

Здесь три файла в том же порядке, что и выше.

Вам не нужно распечатывать вывод, но я буду включать вывод терминала ниже примеров файлов.Файл подпроцесса:

from subprocess import Popen,PIPE

p1 = Popen(["python","output_file.py"], stdout=PIPE)
p2 = Popen(["python", "input_file.py"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()

output = p2.communicate()[0]

print(output)

Выходной файл очень прост, и может быть способ обойти его.Тем не менее, вот моя версия:

print(1)
print(2)
print('My String')

Входной файл требует приведения типов к числам.

i = input('Enter a number: ')
j = input('Enter another: ')
k = int(i) + int(j)
print(k)
l = input('Tell me something. ')
print(l)

Вот вывод терминала:

b'Enter a number: Enter another: 3\r\nTell me something. My String!\r\n'
...