我正在学习python并使用子进程模块。在阅读了几个不同的教程和如何使用模块的描述后,我的理解仍然不是非常可靠,所以我开始编写一些简单的代码来测试各种函数,看看一切是如何工作的。
我想知道如果我尝试使用此代码多次启动相同的进程,它会如何表现:
import subprocess
def tpltest(x):
while x > 0:
try:
subprocess.Popen('wordgrinder')
except:
print 'something broke!'
x -= 1
x = raw_input('how many?')
tpltest(x)
当我在终端中运行它时,wordgrinder(终端字处理器)正常打开,但随后光标以大约每秒一行的速率向下移动。它似乎只是移动,而不是任何字符被添加到屏幕上的空白文件。我按ctrl + c查看关闭第一个实例后是否仍然保留了一个wordgrinder并且遇到了我的常规命令行提示符,但是光标继续滚动。我跑了顶,并没有看到额外的wordgrinder实例打开,但光标继续滚动。
然后我发现了最奇怪的部分。如果我在窗口中向上滚动鼠标滚轮,则会在窗口的内容上显示大量文本。一些块是过去一周我在控制台中输入的命令,其中一些是我在python shell中输入的命令,而不是常规终端,一些文本是我的WiFi安全信息,包括明文WPA2我的网络密码。向下滚动鼠标滚轮没有任何效果,但向上滚动会用新文本覆盖几行,似乎来自我系统中的其他随机位置。关闭终端窗口并打开一个新窗口后,事情恢复正常。
我使用XFCE运行Debian 8 64bit并使用默认终端仿真器。
我的代码做了什么,为什么?
答案 0 :(得分:0)
我可以提供的解释是,子进程的作用是运行后台进程。此外,wordgrinder是一个程序,它通过捕获键盘输入(stdin)和以非常特殊的方式控制命令行(stdout)来完全控制终端会话。
当你通过脚本在后台运行wordgrinder时,它会导致一些时髦的事情发生。您的WiFi密码最终会从实验中显示出来,这真是太疯狂了。