我正在嘗試撰寫一個呼叫 python 程式的腳本,暫停直到程式輸出特定訊息(而不是程式結束時),然后繼續。
如果我有像這樣無限期運行的 example.py:
doSomething()
print('I did something')
doSomethingElseForever()
我想要一個這樣的腳本:
echo "Running python program"
python3 example.py &
waitForOutput("I did something")
echo "Python program did something, it's still running in the background"
doSomeMoreScriptStuff
理想情況下,我只運行腳本,它會啟動 example.py,暫停直到 example.py 輸出“我做了某事”,然后繼續啟動更多程式或其他什么,而不停止 example.py(因此是 &)。
我正在 Ubuntu 中作業。
編輯:我認為目前在我的特定應用程式中,我可以更改我的 python 腳本來創建一個檔案而不是 print(),但是為了學習(并且因為這似乎是一種令人費解的做事方式),讓我們假設我無法編輯 python 檔案。因此,我所要做的就是使用 print() 陳述句的已知輸出。
uj5u.com熱心網友回復:
您可以使用pexpect. 我啟動了一個執行緒,該執行緒呼叫pexpect.spawn()運行您的子腳本。它等待您想要的輸出,然后設定一個事件,以便主程式知道該事件已發生。然后等待子程式退出,這反過來又允許主程式退出:
#!/usr/bin/env python3
import pexpect
import time
import threading
doneIt = threading.Event()
def childHandler():
"""Spawns the child and manages its output"""
global doneIt
print('HANDLER: Spawning child')
child = pexpect.spawn('./example.sh')
print('HANDLER: Child spawned, waiting for it to do something')
child.expect('I did something')
doneIt.set()
print('HANDLER: Waiting for child to finish')
child.expect(pexpect.EOF)
print('HANDLER: Done')
if __name__ == "__main__":
print('MAIN: Starting')
cH = threading.Thread(target=childHandler)
cH.start()
# Wait for event and do other stuff, like printing
while True:
print('MAIN: waiting for child to do something')
if doneIt.wait(1):
break
print('MAIN: Continuing...')
# Wait till childHandler exits before exiting
cH.join()
print('MAIN: Exit')
我將其example.sh用作您呼叫的 Python 腳本的模型:
#!/bin/bash
LOG="run.txt"
date 'Running: %H:%M:%S' > "$LOG"
for ((i=8;i>0;i--)) ; do
date 'Running: %H:%M:%S' >> "$LOG"
sleep 1
done
date 'SUCCESS: %H:%M:%S' >> "$LOG"
echo "I did something"
for ((i=1;i<10;i )) ; do
date 'Continuing: %H:%M:%S' >> "$LOG"
sleep 1
done
date 'DONE: %H:%M:%S' >> "$LOG"
這是日志:
Running: 13:05:27
Running: 13:05:27
Running: 13:05:28
Running: 13:05:29
Running: 13:05:30
Running: 13:05:31
Running: 13:05:32
Running: 13:05:33
Running: 13:05:34
SUCCESS: 13:05:35
Continuing: 13:05:35
Continuing: 13:05:36
Continuing: 13:05:37
Continuing: 13:05:38
Continuing: 13:05:39
Continuing: 13:05:40
Continuing: 13:05:41
Continuing: 13:05:42
Continuing: 13:05:43
DONE: 13:05:44
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376539.html
