我正在使用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的建议。我也希望不必为此问题创建批处理文件。
答案 0 :(得分:0)
我找到了解决这个问题的方法。
要将输入从一个python文件发送到另一个(python版本3.7),我使用了三个文件。
这三个文件的顺序与上面相同。
您不需要打印输出,但是我将在文件示例下面包含终端输出。 子流程文件:
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'