![](/img/trans.png)
[英]How to store and echo multiple lines elegantly in bash answer not working?
[英]How to do this just as elegantly in Python?
我只是在學習Python。 我希望使用Python的一件事是Linux Shell腳本。 我一直在研究一些示例,並通過將bash腳本轉換為Python進行練習。
我只是花了幾個小時將自己的bash腳本之一轉換為Python,而我對最終的代碼卻非常失望。 它更加冗長且語法混亂。 當然,它不像我剛開始使用的bash腳本那樣簡潔明了。
然后我偶然發現了這個(不相關的)Ruby腳本。 哇。 似乎可以直接訪問外殼,這與Python的語言和外殼之間只有一兩層的Python不同。
#! /usr/bin/ruby
MAX_TIME_SINCE_START = 1800
begin
curr_time = Time.new.to_i
kslideshow_processes_list = `pgrep kslideshow.kss`.split("\n")
kslideshow_processes_list.each { |kslideshow_process|
kslideshow_process.strip!
ps_result = `ps -p #{kslideshow_process} -o lstart`
process_start_date = `ps -p #{kslideshow_process} -o
lstart`.split("\n")[1].strip
get_date_command = "date -d \"#{process_start_date}\" +\"%s\""
kslideshow_start_time = `#{get_date_command}`.to_i
time_since_started = curr_time - kslideshow_start_time
if time_since_started MAX_TIME_SINCE_START
system( "kill #{kslideshow_process}" )
end
}
sleep MAX_TIME_SINCE_START
end while true
我希望從bash腳本切換到Python會產生這種代碼。 在Python中是否可以如此簡潔地編寫Shell腳本?
對於我來說,看到上面知道自己在做什么的人將上面的代碼轉換為Python,對我來說非常有教育意義。
我不打算開始Ruby與Python的討論。 我只是想看看有比我了解更多Python的人可以多么干凈地在Python中實現上述任務。 這對這個網站是一個公平的問題嗎? 謝謝
通過使用plumbum
軟件包,IMO至少可以像Ruby一樣優雅地做到這一點。 有多種方法可以優化系統調用(例如,使用dateutils
從日期格式轉換為日期,或使用psutils
),但這不再是調用系統實用程序的比較(我希望我從Ruby示例中獲得正確的邏輯):
from time import time, sleep
from plumbum.cmd import pgrep, ps, date, kill
MAX_TIME_SINCE_START = 5 # 1800
while True:
curr_time = time()
for kslideshow_process in pgrep("gimp").split():
print kslideshow_process
process_start_date = ps("-p", kslideshow_process, "-o", "lstart"
).split("\n")[1].strip()
kslideshow_start_time = int(date("-d", process_start_date, '+%s'))
print kslideshow_start_time
time_since_started = curr_time - kslideshow_start_time
if time_since_started > MAX_TIME_SINCE_START:
kill([kslideshow_process])
sleep(MAX_TIME_SINCE_START)
您可以使用from plumbum.cmd import ...
導入任何命令行程序,該程序將自動作為以命令行參數作為參數的函數提供。 您還可以制作命令鏈:
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]
result = chain()
因此,幾乎不需要中間變量將結果從一個子外殼傳遞到另一個子外殼。
除非有壞主意和方法可以引起您的注意,..以下是在python中打開另一個進程的更有效方法的示例...
process = subprocess.Popen([MyCommand, parameter1, "parameter 2"], shell=False, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
stdout,stderr = process.communicate()
return_code = process.poll()
使用popen進行處理比其他一些語言要多一些開銷,但是它提供了很多通用性,而我所不知道的其他腳本語言提供了從許多進程中獲取輸出的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.