【问题标题】:Problem Using Python's subprocess.communicate() on Windows在 Windows 上使用 Python 的 subprocess.communicate() 的问题
【发布时间】:2009-10-28 16:29:55
【问题描述】:

我有一个我试图通过 Python 和 subprocess 模块控制的应用程序。基本上我所做的是使用 Popen 启动应用程序(它打开一个命令提示符,程序在其中执行),然后在稍后执行的某个时间点,我需要向该程序的 STDIN 发送一个字符串(一个命令) .除了在我手动在 Python 已启动的应用程序的命令窗口中键入一个按钮之前,该命令不会得到处理,这很好用。这是我的代码的一部分:

cmd = 'quit\n'
app.communicate(cmd.encode('utf-8'))

有什么想法吗?

编辑#1

是的,键入一个按钮确实意味着按下键盘上的一个键,很抱歉造成混淆。我在下面附上了更多我的代码

app = Popen(['runProg.exe', '-m', '20'], stdin=PIPE, universal_newlines=True)
while not os.path.exists('C:/temp/quit-app.tmp'): time.sleep(1)
app.communicate('quit')
os.remove('C:/temp/quit-app.tmp')

所以应该发生的事情是程序应该运行,直到创建 quit-app.tmp 文件;一旦它被创建,“退出”应该被发送到应用程序,这是一个让它干净地关闭的命令。如果有人在运行这个程序,他们只需在命令窗口中输入“quit”即可。谢谢!

【问题讨论】:

  • 您能否确认“键入按钮”是指按一个键(键盘) - 我想是这样,但只是为了避免混淆。这是一个普通的控制台应用程序吗?你的 Popen 电话是什么样的?也许粘贴更多代码,没有太多工作要做。

标签: python subprocess


【解决方案1】:

尝试:

cmd = 'quit\n\r'

编辑:

唯一对我有用的是:

app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
app.stdin.write('exit\r\n')

因为正如documentation 所说:

Popen.communicate(input=None)

与进程交互:发送数据到 标准输入。从标准输出读取数据并 stderr,直到到达文件结尾。 等待进程终止。这 可选输入参数应该是 要发送给孩子的字符串 进程,或无,如果不应该有数据 发送给孩子。

【讨论】:

  • 好的,我刚刚尝试过,但我仍然遇到同样的问题。不过谢谢!
  • 理论上是\r\n 而不是\n\r,不确定这是否对您的应用程序有影响。为避免转换字符串,您可以在调用 Popen 时将可选的 universal_newlines 参数设置为 True。通常在 Windows 上,管道以二进制模式打开,实际上,如果您不使用此选项,则必须按照 bua 的建议进行操作(显然还有其他内容)。因此,无论您的问题如何,请使用此选项或添加 \r\n
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多