我的python子进程是否破坏了什么?

时间:2016-03-11 16:55:33

标签: python linux subprocess

我正在学习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并使用默认终端仿真器。

我的代码做了什么,为什么?

1 个答案:

答案 0 :(得分:0)

我可以提供的解释是,子进程的作用是运行后台进程。此外,wordgrinder是一个程序,它通过捕获键盘输入(stdin)和以非常特殊的方式控制命令行(stdout)来完全控制终端会话。

当你通过脚本在后台运行wordgrinder时,它会导致一些时髦的事情发生。您的WiFi密码最终会从实验中显示出来,这真是太疯狂了。