簡體   English   中英

如何在Python中優雅地做到這一點?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM