我正在编写一个脚本,其中外部系统命令有时可能需要用户输入。我无法正确处理。我曾尝试使用 os.popen4 和 subprocess 模块,但无法实现所需的行为。
下面提到的示例将使用“cp”命令显示此问题。(“cp”命令用于显示此问题,我正在调用一些不同的 exe,在某些情况下可能会类似地提示用户响应)。在此示例中,磁盘上存在两个文件,当用户尝试将 file1 复制到 file2 时,会出现一条conformer 消息。
proc = subprocess.Popen("cp -i a.txt b.txt", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,)
stdout_val, stderr_val = proc.communicate()
print stdout_val
b.txt?
proc.communicate("y")
现在在这个例子中,如果我只读取 stdout/stderr 并打印它,稍后如果我尝试根据用户的输入写入“y”或“n”,我会收到一个错误,即通道已关闭。
有人可以帮我在python中实现这种行为,这样我就可以先打印标准输出,然后再接受用户输入并稍后再写标准输入。
我在 python 中的 subprocess.PIPE 上的非阻塞读取中找到了另一个解决方案(线程),不确定它是否有帮助。但它似乎是来自 cp 命令的打印问题,我已经修改了代码,但不确定如何编写线程代码。
import sys
from subprocess import PIPE, Popen
from threading import Thread
try:
from Queue import Queue, Empty
except ImportError:
from queue import Queue, Empty
ON_POSIX = 'posix' in sys.builtin_module_names
def enqueue_output(out, queue):
for line in iter(out.readline, b''):
queue.put(line)
out.close()
p = Popen(['cp', '-i', 'a.txt', 'b.txt'],stdin=PIPE, stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.start()
try:
line = q.get_nowait()
except Empty:
print('no output yet')
else:
pass