当前位置: 首页 > 面试题库 >

Python子流程和用户交互

田俊爽
2023-03-14
问题内容

我正在Python
2.6的GUI前端上工作,通常它非常简单:您使用subprocess.call()subprocess.Popen()发出命令,然后等待命令完成或对错误做出反应。如果您有一个程序停止并等待用户交互,该怎么办?例如,程序可能会停止并要求用户提供ID和密码或如何处理错误?

c:\> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he's Resting, (h) [Hit cage] he moved, (p) he's Pining for the fjords

到目前为止,我所阅读的所有内容都告诉您如何仅 程序完成
读取程序的所有输出,而不是如何在程序仍在运行时处理输出。我无法安装新模块(这是针对LiveCD的),并且我将多次处理用户输入。


问题答案:

查阅子流程手册。你有选择subprocess,以便能够重定向stdinstdout以及stderr过程中你打电话给你自己。

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

grep_stdout = p.communicate(input='one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print grep_stdout

您还可以逐行与过程交互。给定为prog.py

import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()

您可以通过以下方式逐行与其交互:

>>> from subprocess import Popen, PIPE, STDOUT
>>> p = Popen(['python', 'prog.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> p.stdout.readline().rstrip()
'what is your name'
>>> p.communicate('mike')[0].rstrip()
'your name is mike'

编辑:在python3中,它必须为'mike'.encode()



 类似资料:
  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 问题内容: 我的python脚本(python 3.4.3)通过子进程调用bash脚本: 该 bashscript 包含以下行: 这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。 执行python脚本时,它将提示输入该行的密码,但是在输入密码后它将阻塞,并且永远不会返回。当我按ctrl- C终止脚本时,我看到连接已正确建立(因此行已成功执行)。 使用代替时,我没有此阻塞问题,但不检索标

  • 问题内容: 考虑下面的C程序(test.c): 哪个应该打印一行到stdout,一行到stderr,然后等待用户输入,然后另一行到stdout,另一行到stderr。很基本!当编译并在命令行上运行时,完成后程序的输出(接收到getchar()的用户输入): 当尝试使用带有以下代码的nodejs将这个程序作为子进程生成时: 输出如下所示: 与在终端中运行./test时看到的输出非常不同。这是因为当由

  • 接口交互流程图: 完整交互流程图: 登录状态: 游客(未登录)状态:

  • 问题内容: 在python中,是否有一种方法可以调用一个新进程,在同一个上下文中处理它,例如标准IO流,关闭当前进程,并控制所调用的进程?这将有效地“替代”该过程。 我有一个要重复其行为的程序。但是,它使用了一个第三方库,而且看来,我真正能够杀死该库调用的线程的唯一方法是退出()我的python进程。 另外,它似乎可以帮助管理内存。 问题答案: 您可能对以下朋友感兴趣: 这些功能都执行一个新程序,

  • 是否可以使用RabbitMQ主题交换实现以下场景。 假设我有两个队列: 队列1:路由关键字MainRoute。路线1 Queue2:路由密钥MainRoute.Route2 使用路由密钥发布邮件时: 主要路线。路线1- 主干道。路线2 - 主要路线- 是否可以实现这一点,而不需要实施一些特殊的过滤、路由过程? 如果没有,你能建议一个可能的解决方案吗? 谢谢你。