0

我有一个使用 os.popen4 执行某些命令的脚本。问题是正在执行的某些时间命令将需要用户输入(“y”或“n”)。我正在阅读 stdout/stderr 并打印它,但似乎命令中的问题没有被打印并且它挂起。为了使它工作,我不得不盲目地将“n”写入标准输入。有人可以指导如何处理吗?

代码不起作用:

   (f_p_stdin, f_p_stdout_stderr) = os.popen4(cmd_exec,"t")
    cmd_out = f_p_stdout_stderr.readlines()
    print cmd_out
    f_p_stdin.write("n")
    f_p_stdin.close()
    f_p_stdout_stderr.close()

工作代码:

   (f_p_stdin, f_p_stdout_stderr) = os.popen4(cmd_exec,"t")
    cmd_out = f_p_stdout_stderr.readlines()
    f_p_stdin.write("n")
    f_p_stdin.close()
    print cmd_out
    f_p_stdout_stderr.close()

注意:我知道它已被折旧并且使用了子流程模块,但现在我不知道如何使用它。因此,如果有人能帮助我使用 os.popen4 处理它,我将不胜感激。我想捕获问题并处理来自用户的输入并执行它。

4

1 回答 1

0

readlines():返回一个包含文件中所有数据行的列表。如果从这种情况下的进程中读取,很有可能它不会发送换行符和/或刷新输出。您应该从输入中读取字符并对其进行处理以查看是否提出了问题。

知道是什么cmd_exec样子会有所帮助,这样其他人就可以尝试模仿您的尝试。


更新:

uncheckout用 Python 写了一个命令:

#! /usr/bin/env python
# coding: utf-8

import sys

print 'Uncheckout of {} is irreversible'.format(sys.argv[1])
print 'Do you want to proceed? [y/N]',
sys.stdout.flush()
x = raw_input()

if x == 'y':
    print sys.argv[1], "no longer checked out"
else:
    print sys.argv[1], "still checked out"

我故意将提示字符串不作为 raw_input 的参数,以便能够flush()显式执行。

您的代码片段都不能使用它(假设cmd_exec['./uncheckout', 'abc.txt']or './uncheckout abc.txt'popen4()在后一种情况下使用 shell 来启动程序)。只有当我readlines()在 write() 和 close() 之后移动 until 时,命令才会继续。这对我来说很有意义,因为 close() 会刷新输出。您正在以文本模式编写,并且通常会缓冲到行尾,这不在您的.write('n').

为了能够检查提示是什么并对其进行测试和反应,以下内容适用于上述内容uncheckout

#! /usr/bin/env python
# coding: utf-8

import os
import sys

cmd_exec = ['./uncheckout', 'abc.txt']

(f_p_stdin, f_p_stdout_stderr) = os.popen4(cmd_exec,"t")
line = ''
while True:
    x = f_p_stdout_stderr.read(1)
    if not x:
        break
    sys.stdout.write(x)
    sys.stdout.flush()
    if x == '\n':
        line = ''
    else:
        line += x
    if line.endswith('[y/N]'):
        f_p_stdin.write("n\n")
        f_p_stdin.flush()
        sys.stdout.write('\n')

也许你可以从那倒过来做一些适合你的东西。确保在适当的地方保持冲洗。

于 2013-03-14T19:55:27.970 回答