我正在用Python编写壁纸管理器。我的目标是针对Linux的这个项目,并希望使脚本易于插入自动启动文件(例如.xinitrc等等)。我希望通过输入诸如......之类的命令来实现一系列可以生成的功能。
<wallpaper_manager_program> --reject (load new wallpaper, delete previously displayed)
<wallpaper_manager_program> --next-image
<wallpaper_manager_program> --prev-image
<wallpaper_manager_program> --randomize-image
<wallpaper_manager_program> --change [specific-image-file]
<wallpaper_manager_program> --update (pull down new wallpapers from a chosen url)
当程序已经运行时,来自shell的等等。用户可以使用他们喜欢的任何键绑定工具包装各种命令(例如xbindkeys,Unity等)。哪种方法最适合我的问题?简而言之,我想:
我并不十分关心让应用程序进行相互通信需要做多少工作,但显然更喜欢不那么繁琐的方法,因为程序没有存储任何关于个人的重要数据或做任何非常重要的事情(嗯,这取决于你如何看待你的背景图片...)
作为澄清:我不是要求从Python脚本调用shell命令,而是如何从shell更改我的脚本行为。
修改 在最初询问的时候,我一般都不了解IPC,因此对问题进行了改进,以反映(希望)更具体的调查,以确定哪种IPC方法最适合这个项目。
答案 0 :(得分:3)
这基本上是一个关于进程间通信的问题 - 答案根据你的目标而大不相同。
实现此目的的方法是将包含wallpaper-display-app的PID的PID文件写入一个众所周知的位置。然后管理器可以查看该PID,并向运行过程发送信号(例如signal.SIGUSR1)。在那里,您只需要一个信号处理程序来触发所需的行为。
其他选项是众所周知的端口上的HTTP,名为pipes,DBUS等。
HTTP是最简单的:只需使用内置的SimpleHTTPServer或wsgiref在非特权端口上启动Web应用程序。收听传入的请求,并做出相应的反应。
这样做的缺点是分配可能导致冲突和安全问题的系统资源(端口)。
命名管道通过使用众所周知的端点来避免这种情况,例如: / tmp / wallpaper-saver-fifo作为文件名,您可以让经理和后台进程进行通信。我想我会这样做,食谱可以在网上找到,例如这里http://www.roman10.net/named-pipe-in-linux-with-a-python-example/
使用这些没有细节的细节可能是nanomsg,它具有python绑定并使这些事情变得非常容易。
DBUS是其他应用程序已经使用的系统级IPC机制。我只涉及它 - 它不是很难,但因为它更关心安全性,它可能有点麻烦,根据你的实际用例,可能有点过头了。
答案 1 :(得分:1)