我正在用python编写一个壁纸管理器。我的目标是这个项目的Linux,并希望使脚本容易进入自动启动文件(如.NILTRC,ET.A.)。我希望实现一系列功能,这些功能可以通过输入命令生成,例如…
<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等)包装各种命令。哪种方法最适合我的问题?简而言之,我想:
随着时间的推移,未来的功能空间
安全性(例如,这样人们的图像就不会被某个正在读取的配置文件弄脏的人意外地删除或覆盖)
轻量级(不占用系统资源,因为程序毕竟是一个后台管理器;而不是一个花哨的windows管理器…)
响应(这样,如果有人发出拒绝命令,该命令将立即完成,而不是下一次循环的例程调用)
我并不十分担心让应用程序进行交互需要做多少工作,但显然我更希望使用不那么麻烦的方法,因为程序没有存储任何关于个人的重要数据,也没有做任何非常重要的事情(好吧,这取决于你如何看待你的背景图片…)
作为澄清:我不是问如何从python脚本调用shell命令,而是问如何从shell更改我的脚本行为。
编辑:
在最初的提问中,我并不知道ipc的一般情况,因此我对问题的部分进行了改进,以反映(希望)更具体的调查,即ipc的哪种方法最适合这个项目。
最佳答案
这本质上是一个关于进程间通信的问题——答案根据你的目标而有很大的不同。
实现这一点的方法是将包含墙纸显示应用程序的PID的PID文件写入一个众所周知的位置。然后管理器可以查找这个PID,并向运行的进程发送一个信号(例如signal.sigusr1)。在这里,您只需要一个信号处理程序来触发所需的行为。
其他选项包括著名端口上的http、命名管道、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机制。我只涉猎过它-这并不难,但因为它更关心安全性,它可能有点麻烦,取决于您的实际用例可能有点过头了。
关于python - 使用shell命令更改正在运行的程序行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29646643/