我很感謝線程的一些幫助,這是我很新的東西。Python:在一個線程中停止另一個線程從另一個線程結束
示例代碼並不完全是我正在做的('記事本'和'calc'只是示例命令),但是顯示我的問題的簡化版本。
我想運行兩個獨立的線程,每個線程多次運行不同的命令。我想代碼做到這一點:當我關閉的「記事本」實例
- 啓動「記事本」和「計算」同時 (它確實)
- 的第一個實例,打開 '記事本'的下一個實例。
- 當我關閉'calc'的實例時,打開 下一個'calc'實例。
- 我希望腳本等到兩個線程都完成後,因爲它需要對這些輸出進行一些處理。
然而,當我關閉「記事本」的一個實例,「記事本」的下一個實例不會啓動,直到我已經關閉「鈣」的當前實例,反之亦然。隨着一些排除錯誤,它看起來像'記事本'封閉實例的過程(來自Popen)直到當前'calc'被關閉纔會結束。
在Windows上運行的Python 2.7 7
示例代碼:提前
from subprocess import Popen, PIPE, STDOUT
from threading import Thread
def do_commands(command_list):
for command in command_list:
proc = Popen("cmd.exe", stdin=PIPE, stdout=PIPE, stderr=STDOUT)
stdout_value, stderr_value = proc.communicate(input=command)
# MAIN CODE
A_command_list = ["notepad\n", "notepad\n", "notepad\n" ]
B_command_list = ["calc\n", "calc\n", "calc\n" ]
A_args = [A_command_list]
B_args = [B_command_list]
A_thread = Thread(target=do_commands, args=(A_args))
B_thread = Thread(target=do_commands, args=(B_args))
A_thread.start()
B_thread.start()
A_thread.join()
B_thread.join()
感謝:-)
尼克
而不是使用'Popen'和'communic'來啓動一個cmd,難道你不能啓動真正的可執行文件嗎?像'subprocess.call(['notepad.exe'])'? (我沒有Windows,所以你必須找到你必須使用的確切名稱)。 – Bakuriu
@Bakuriu - 感謝您的參與。我考慮使用調用,但我需要stdout和stderr,並且文檔中提到「注意:不要對此函數使用stdout = PIPE或stderr = PIPE,因爲它可能會根據子進程的輸出量死鎖。請使用Popen和communicate()方法當你需要管道。「 –
@NickFromage如果你需要標準輸出你可能想使用['check_output'](https://docs.python.org/3/library/subprocess.html#subprocess.check_output)。基本上是'call' +'stdout = PIPE',它使用'communic'來獲得輸出。 – Bakuriu