繁体   English   中英

如何使用子流程与python脚本进行交互

[英]How to use subprocess to interact with a python script

我正在用python编写python的IDE,并且需要使用子进程与用户的脚本进行交互。

我对使用子流程是完全陌生的,不确定在这里做什么。 我创建了一个测试片段,以表示我要执行的操作:

from subprocess import Popen,PIPE,STDOUT
import tkinter as tk

t=tk.Text()
t.pack()

p = Popen(["python","c:/runme.py"],stdout=PIPE,stdin=PIPE,stderr=PIPE,shell=True)
p.stdin.write("5".encode())
out=p.stdout.read()

t.insert(1.0,out)

这是我尝试与之交互的测试脚本:

print("Hello World")
inp=input("Enter a Number: ")
print(inp)
quit()

不幸的是,它只是在第2行上等待(大概)。如何读取已经打印的内容,然后如何输入字符串?

您必须定期刷新stdout,因为如果脚本未连接到终端,则不会自动刷新输出:

import sys
print("Hello World")
print("Enter a Number: ")
stdout.flush()
inp = input()
print(inp)

并且您必须通过返回\\n终止输入:

p = Popen(["python", "c:/runme.py"], stdout=PIPE, stdin=PIPE, stderr=PIPE)
p.stdin.write("5\n".encode())
out = p.stdout.read()

删除shell=True 当前,您根本执行脚本,而只是启动python交互式解释器。

问题在于, 当您使用shell=True ,解释第一个参数的方式会改变。 您不需要shell=True并且您提供的参数对于shell=False版本是正确的。

看到之间的区别:

>>> import subprocess
>>> subprocess.Popen(['python', 'whatever'], shell=True)
<subprocess.Popen object at 0x7ff1bf933d30>
>>> Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
KeyboardInterrupt
>>> 
KeyboardInterrupt

您可能会注意到,这会启动一个卡住的python解释器,并且这是:

>>> import subprocess
>>> subprocess.Popen(['python', 'whatever'])
<subprocess.Popen object at 0x7f14e1446cf8>
>>> python: can't open file 'whatever': [Errno 2] No such file or directory

哪个试图执行whatever


另外,您应该考虑使用communicate方法,而不是直接从stdin / stdout读写。

我知道这有点晚了,但是我希望这对现在有类似问题的任何人有所帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM