我很長一段時間的讀者,但這是我的第一個問題。
我正在編寫一個Python 3程序(我目前正在自學)編譯和運行一組C++程序,該程序應該做同樣的事情(學生爲作業提交)並將其輸出與我在文本文件中已經有了預期的輸出。從超時運行python的可執行文件
我正在尋找一種方式來運行這些可執行文件,允許我:
- 在一定時限內終止後的可執行文件(比如,10秒),如果它沒有結束。
- 捕獲可執行文件的所有輸出(包括stdout,stderr和任何「shell」消息,如分段錯誤,內存/內核轉儲等..)
- 即使可執行文件崩潰或被強制終止超過允許的時間後),我需要捕獲到那個點的「部分」輸出。
- 沒有任何內容出現在屏幕上(沒有輸出或錯誤消息)。
我到目前爲止試過的一切(從類似問題的答案中)都缺少了一些東西。我找不到滿足我所有需求的東西(上述要點)。 下面是一些例子:
check_output()(如在this問題)不會收集輸出,如果可執行崩潰,而有些信息(如核心轉儲)還是去到屏幕上。
Popen()(如this)似乎不會終止可執行文件(超過時間時)。 Python線程結束(我希望我在這裏使用正確的術語),但可執行文件保持運行。
即使像os.system()這樣的方法不鼓勵,但我試過它們,他們沒有更好的表現。
我非常感謝它,如果有人能指出我的方式來實現這一點。我對任何語法錯誤表示歉意,因爲英語不是我的第一語言。請讓我知道是否需要任何進一步的細節。 謝謝
編輯:
這裏是我的Python代碼最小副本:
from subprocess import STDOUT, check_output, TimeoutExpired
timeLimit = 3 # seconds
strOutput = ''
try:
output = check_output('./a.out', stderr = STDOUT, timeout = timeLimit)
strOutput = ''.join(map(chr, output))
except TimeoutExpired as e:
strOutput += 'Error: Time limit exceeded, terminated..'
except Exception as e:
strOutput += 'Error: ' + str(e)
f = open('report.txt','w')
f.write(strOutput)
f.close()
我還包括一些C++的樣品含有一些錯誤,以創建可執行文件使用測試以前的代碼。 它們都可以被編譯爲:克++ programName.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "This one is working correctly!" << endl;
}
下面的代碼「被零除」錯誤導致。該錯誤之前打印的語句不是由check_output()
#include <iostream>
using namespace std;
int main()
{
cout << "Trying to divide by zero.." << endl;
cout << 3/0 << endl;
}
此代碼等待一個意想不到的輸入(應該由腳本指定的超時之後終止)捕獲
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "Waiting for an unexpected input.." << endl;
cin >> x;
}
我不能找到可靠的方法來重現核心轉儲問題。核心轉儲是一個特殊情況,因爲check_output()無法捕獲其輸出(它直接/僅顯示在屏幕上)。
P.S.我無法添加標籤'check_output()',我沒有足夠的聲望。
你在使用什麼操作系統? – unutbu
我目前正在我的Linux Mint 18.1筆記本電腦上運行,但此腳本旨在運行在學校的Ubuntu 16.04服務器上。 – Elman
帶有'timeout'的'subprocess.call()'在異常處理程序中調用'p.kill()'和'p.wait()',如果超時過期,則調用該異常處理程序。因此,它實際上殺死了立即產生的進程。 –