防止subprocess.call()显示文本

时间:2014-05-31 05:09:10

标签: python raspberry-pi raspbian

使用Raspberry Pi(raspbian)我为python修改了this幻灯片脚本,读取了PIR运动传感器。

在原件中,当一段时间没有动作时PIR关闭后,PIR会打开显示器(HDMI)。我希望运动传感器能够启动新图像的显示。

因此,无论何时触发PIR,我都会调用此函数:

def new_pic():
    sys.stderr.write("\x1b[2J\x1b[H")
    myList = []
    file = open("dir.txt","rt")
    for line in file:
        myList.append(line)
    file.close()
    count = len(myList)
    rnd = randint(0,count-1)
    current_image = myList[rnd]
    current_image = current_image[:-1]
    proc = subprocess.Popen(["pgrep", "fbi"], stdout=subprocess.PIPE)
    for pid in proc.stdout:
        os.kill(int(pid), signal.SIGTERM)
    subprocess.call(["fbi", "-noverbose", "-a", "-T", "2", "/home/pi/photoframe/photos/"+current_image])

我在crontab中使用rsync来更新图像池。在每次rsync之后,我将文件列表写入'dir.txt'。

它有效,我唯一的问题是每次加载新图像时,终端文本会显示一秒钟。我尝试通过修改-bashrc并在启动我的python脚本之前运行'clear'来使提示变黑。

这就是我磕磕绊绊的地方: 当调用fbi时,它会显示

using "DejaVu Sans Mono-16", pixelsize=16.67 file=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf

我尝试添加

> /dev/null

到fbi命令的末尾,但它忽略了它。

在我以前的尝试中,我只是不断调用新的fbi实例 - 但是它们会堆积在TOP中,而在某些时候Pi会耗尽资源。另一种方法是跟踪fbi实例并在调用下一个实例后将其终止...

我已经在圈子里跑了几个星期了 - 任何帮助都会非常感激。

后续行动:

第一个答案确实删除了fbi(subprocess.call)的输出。

现在我看到的东西......真的很快 - 闪烁的白色文字。

我认为这与if if语句的事实有关:

if io.input(PIR_PIN):
    if time.time() > (last_flip + SWITCH_TIMER):
         new_pic()
每次PIR触发并且足够的时间过去后,

被调用8到10次......

我认为time-if只允许调用new_pic()一次。 last_flip设置为fbi ...

显示新图片后的当前时间

如何确保只调用new_pic()一次?

谢谢! 安德鲁

1 个答案:

答案 0 :(得分:2)

subprocess的文档中,子进程启动另一个程序并具有stdin,stdout和stderr参数,以便程序的I / O可以重定向到其他文件。

默认值为None,这会使子级继承父级的I / O文件,这就是为什么它会将文本泄漏到您的界面中。

你可以打开一个文件,包括/dev/null黑洞,并通过这样的方式发送输出:

shutup = open("/dev/null","w") 
subprocess.call(["fbi", "-noverbose", "-a", "-T", "2", "/home/pi/photoframe/photos/"+current_image], 
                stdout=shutup,
                stderr=shutup)

另一方面,您可能希望保存输出并在python中解析它,并确保fbi完成预期的操作。