2015-04-15 71 views
1

我正在使用Python編寫壁紙管理器。我將這個項目的目標鎖定爲Linux,並希望使腳本容易陷入自動啓動文件(如.xinitrc等)中。我希望實現的是可以通過輸入命令來產生諸如功能的主機...使用shell命令更改正在運行的程序行爲

<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) 

等從外殼雖然程序已經運行。用戶可以使用他們喜歡的任何鍵綁定工具(例如xbindkeys,Unity等)來包裝各種命令。哪個是我的問題最合適的IPC方法?概括地說,我想:

  • 爲未來的功能,隨着時間的推移
  • 安全性(例如,讓人們的圖像沒有得到意外刪除或有人與同時被讀取配置文件搞混覆蓋)
  • 輕量級(沒有佔用系統資源,因爲該程序是後臺管理器;而不是花哨的Windows管理器...)
  • 響應式(以便如果有人發出拒絕命令,命令將立即完成,而不是下一次例行調用的迭代)

我並不十分關心獲取應用程序進行相互通信需要付出多少努力,但顯然寧願使用不那麼麻煩的方法,因爲該程序沒有存儲任何有關個人的重要數據或做任何非常重要的事情(很好,這取決於你如何看待你的背景圖像......)

作爲澄清:我不是要求從Python腳本調用shell命令,而是如何從shell中更改我的腳本行爲。

編輯:問題的 當初在問,我不知道IPC一般等有精緻的部分,以反映(希望)更具體的探究哪些IPC的做法將是最適合這個項目。

+0

您是否可以在每次重新加載壁紙操作之前從配置文件加載壁紙的設置。然後,用戶可以修改配置,並在加載新壁紙之前由腳本獲取。 –

+0

我想過在配置文件中每隔一段時間檢查一次「拒絕」選項,但這意味着您需要確保在意外(或惡意)的情況下不會不必要地刪除人們的壁紙,並且不會立即(至少從我想要實現它的角度來看:將您的主要功能放在睡眠延遲上,然後檢查該文件)。 – RJS

+0

要發送到牆紙管理器的信息有多複雜?你是否需要它能夠處理從shell發送給它的大量不同命令,還是隻需要響應一個簡單的'--reject'命令? –

回答

3

這實際上是一個關於進程間通信的問題 - 根據您的目標,答案會有很大的不同。

在完成此任務的方法中,將包含wallpaper-display-app的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機制。我只涉及它 - 這不是很難,但因爲它更關心安全性,它可能有點麻煩,取決於您的實際使用情況可能有點過頭了。

+0

感謝您的回答,這有很大的幫助。一般來說IPC對於IPC來說都是綠色的,所以沒有想到這是一個答案(或其選項)。我認爲對於我的問題DBUS看起來有點像矯枉過正,信號似乎有限,所以我可能會使用命名管道。 – RJS

1

你有一些選項來執行IPC

  • 打開本地主機端口(將允許所有用戶訪問)
  • 打開一個UNIX套接字(這就像與權限的文件)
  • 如果它是一個簡單的信號,請使用signal