簡體   English   中英

用python改變進程狀態

[英]change process state with python

我想搜索一個進程並顯示它,例如emacs,我使用

`p = subprocess.Popen('ps -A | grep emacs',shell=True,stdout=subprocess.PIPE)` 

為了得到這個過程,我該如何將其喚醒並顯示出來?

換句話說,問題應該是:python如何改變進程的狀態?

簡而言之,python有一個pty模塊並在那里尋找解決方案。

這個問題並不像看起來那么簡單。

通過提供相應的信號來改變過程的運行狀態很簡單,但操縱前景/背景屬性並不簡單。

當我們談論操縱前景/后台流程時,我們真的談論“工作控制”。 在UNIX環境中,作業控制是通過協調幾個部分來實現的,包括內核,控制終端,當前shell以及在該shell會話中調用的幾乎每個進程。 告訴過程回到前台,你必須告訴別人閉嘴並同時轉到后台。 看到?

讓我們回到你的問題。 可能有2個答案,一個是沒有辦法,另一個是可以完成但是如何。

為什么2個答案?

一般來說,除非你為它編程,否則你無法控制工作。 您也不能使用簡單的管道來實現導致作業控制機制的協調模型; 原因很重要,因為你無法通過管道傳遞信號。 這就是為什么答案是沒有辦法的,至少在簡單的管道實現中沒有辦法。

但是,如果您有足夠的耐心來編程終端I / O,那么仍然可以通過大量的人力工作來完成。 概念很簡單:你欺騙你的奴隸程序,在這個例子中是emacs,它已被附加到具有真正鍵盤和實體監視器待機的真實終端,並且你准備你的主程序,即python腳本,到處理並將必要的事件從其控制終端中繼到從屬的偽終端。

許多終端仿真器實際上采用了這種模式。 你需要在你的情況下編寫另一個終端模擬器......等等! 總是需要付出這么多努力嗎?

幸運的是沒有。

您的shell在交互式場景中為您管理所有內容。 你只需告訴shell'fg / bg '這個任務,在現實生活中很容易。 指定的命令組合可以在shell的聯機幫助頁中找到。 它可能看起來像' jobs -l | grep emacs '和' fg%1 '。 盡管如此,程序無法調用這些組合命令。 這是一個不同的故事,因為一個程序將啟動一個新的shell來解釋它的命令,這樣一個新的shell無法控制舊的運行emacs,因為它沒有這個特權。 用鍵盤輸入,然后在顯示器上讀出; 這是一個互動場景。

在自動化方案中,在使用作業控制設計之前要三思,因為大多數自動化方案不需要作業控制模式。 你需要一個編輯器和一個玩家,沒關系,但是不要讓它們保持“背景”並彈出“前景”。 當他們完成任務時,他們最好退出。

但是,如果您不幸在自動化程序中編寫作業控制,請嘗試編寫偽終端主從I / O. 它們看起來像一個復雜的IPC機制,它們的細節依賴於操作系統。 然而,這是您問題的標准答案; 雖然煩人,但我知道。

你可以獲得這個過程生成的輸出,讀取stdout描述符:

out = p.stdout.read()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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