簡體   English   中英

在python子進程中保留bash重定向

[英]Preserving bash redirection in a python subprocess

首先,我只允許使用python 2.4.4

我需要在python中編寫一個進程控制器,該控制器會啟動,並且各個子進程監視它們如何影響環境。 這些子流程中的每個子流程本身都是python腳本。

從unix shell執行時,命令行如下所示:

python myscript arg1 arg2 arg3> output.log 2> err.log&

我對輸入或輸出不感興趣,python不需要處理。 python程序只需要知道1)每個進程的pid 2)每個進程是否正在運行。

並且過程連續運行。

我嘗試讀取輸出並再次將其發送出去,但是隨后遇到了readline不是異步的問題,對此有很多答案,其中許多非常復雜。

如何制定一個保留bash重定向操作的python子進程調用?

謝謝

如果我正確理解了您的問題,聽起來您在這里尋找的是能夠啟動腳本列表,並將輸出重定向到文件。 在這種情況下,請啟動每個任務,如下所示:

task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'],
    stdout=open('output.log', 'w'), stderr=open('err.log', 'w'))

這樣做意味着將子進程的stdout和stderr重定向到監視進程打開的文件,但是監視進程在復制數據時不必涉及。 如果需要,您還可以重定向子流程標准輸入。

請注意,您可能想處理錯誤情況等,本例中未處理。

您可以將現有文件描述符用作subprocess.Popen的stdout / stderr參數。 這應該等同於從bash重定向運行。 該重定向是在fork之后用fdup(2)實現的,並且輸出永遠不要觸摸您的程序。 您可能還可以將fopen('/ dev / null')作為文件描述符傳遞。

或者,您可以重定向控制器程序的stdout / stderr,並將None作為stdout / stderr傳遞。 孩子應該在不通過python本身的情況下打印到您的控制器stdout / stderr。 之所以可行,是因為子代將繼承控制器的stdin / stdout描述符,這些描述符在啟動時由bash重定向。

子流程模塊很好。

您也可以在* ix上使用os.fork()和使用WNOHANG的定期os.wait()來執行此操作。

暫無
暫無

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

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