【发布时间】:2023-04-10 10:08:01
【问题描述】:
我有一个 Python 脚本,它需要通过命令行与用户交互,同时记录输出的任何内容。
我目前有这个:
# lots of code
popen = subprocess.Popen(
args,
shell=True,
stdin=sys.stdin,
stdout=sys.stdout,
stderr=sys.stdout,
executable='/bin/bash')
popen.communicate()
# more code
这会执行一个 shell 命令(例如 adduser newuser02),就像在终端中键入它时一样,包括交互行为。这很好。
现在,我想从 Python 脚本中记录屏幕上出现的所有内容。但我似乎无法使那部分工作。
我尝试了各种使用 subprocess.PIPE 的方法,但这通常会破坏交互性,比如不输出提示字符串。
我也尝试了各种方法来直接改变 sys.stdout 的行为,但是当子进程直接写入 sys.stdout.fileno() 时,这一切都无济于事。
【问题讨论】:
-
附带说明,您使用
shell=True有什么原因吗?尤其是当您要启动的东西本身就是/bin/bash时?您基本上是在告诉 Python 启动bash的副本以告诉它启动bash的另一个副本(大概,因为您没有显示整个代码)告诉它启动adduser的副本。你可能甚至不需要一个 shell,但我无法想象你为什么需要两个。 -
@abarnert:
executable不会启动新的bash进程:它告诉subprocess模块使用它的值而不是/bin/sh如果shell=True。args可能是一些带有 bash-isms 的 shell 命令,例如'use_tty &>/dev/null'。据我了解,意图是:script -c '/bin/bash -c "$args"' log。尽管作为my answer shows,您甚至不需要一个额外的 bash 进程来在这里运行命令。
标签: python linux shell subprocess prompt