如何从另一个python脚本(或php execute)将“用户输入”发送到python脚本?

时间:2019-06-04 20:03:13

标签: php python-3.x cmd

我正在使用php和XAMPP创建一个网站。该网站接受用户的python文件,然后需要运行该python文件并接收该文件的所有输出。我已经能够通过在PHP文件中使用shell_exec()来完成此任务。

问题在于获取python文件的用户输入。这些文件同时使用input()和sys.stdin.readline()函数。我需要能够自动发送python文件“用户输入”(有时是多个输入)。我确切知道我将需要发送什么以及多少“用户输入”,因此这不需要我干预。

我认为做到这一点的一种方法是更改​​提交的python文件获取输入的方式。如果我能做到这一点,那么我会将每个输入存储在一个列表中,并对其进行迭代。不幸的是,我无法在提交的文件中编辑实际的输入命令,因此必须在提交的python文件的顶部完成。

这是php文件执行python文件的方式。

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

我尝试使用echo函数(对于多个输入使用&&),但是唯一的问题是,在每次echo之后,echo函数都无法按Enter键。但是,这确实使输入与输入提示匹配。下面是一个例子。 python_script.py应该接受输入然后打印,但cmd显示如下:

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

C:\>

现在,我正在尝试在单独的python文件中使用子流程函数。问题再次出在“用户输入”上。我不知道如何发送输入。解决类似问题的方法对我来说不起作用,但是我敢肯定,这是由于我对子流程功能缺乏了解。

我认为子进程是我最好的选择,但是我也很感谢任何使用php的建议。我也希望不必为此问题创建批处理文件。

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。

要将输入从一个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'