使用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()一次?
谢谢! 安德鲁
答案 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完成预期的操作。