国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Python偽裝文件類對象輸入輸出重定向方法研究

2020-06-29 07:17亓雪冬李霞
微型電腦應用 2020年6期

亓雪冬 李霞

摘 要:針對Python程序自動評測過程中被測試程序輸入輸出流重定向問題進行研究。分析了基于操作系統(tǒng)輸入輸出重定向方法的缺點與不足,基于Python的動態(tài)性提出了Python偽裝文件類對象輸入輸出重定向方法。設(shè)計并實現(xiàn)了滿足標準輸入輸出流接口特性的偽裝文件對象,在Python程序內(nèi)部接管輸入流和輸出流,提高了重定向接口的靈活性,減少磁盤空間占用,嚴格限制輸出流數(shù)據(jù)尺寸,保障評測過程穩(wěn)定進行。該方法在實際應用中效果良好。

關(guān)鍵詞: Python; Online judge; 自動測評; 輸入輸出重定向

中圖分類號: TP 393

文獻標志碼: A

Abstract: The paper studies problems about the IO stream redirection in the automatic evaluation of python language programs.Thepaper analyzes and points out shortcomings of the OS-based IO redirection method, and proposes an IO redirection method using python masquerading file class object. The paper designsand implement masquerading file class objectwhich meets the characteristics of standard IO stream interfaces. This object takes over IO streams inside a python program,increases flexibility of the redirection interface, reduces disk space usage, limits the output stream data size strictly, ensures the stability of the automatic evaluationprocess. This method works well in practical applications.

Key words: Python; Online judge; automatic evaluation; IO redirection

0 引言

程序設(shè)計類課程是當前大學教育課程體系重要組成部分,是重要的通識教育類課程,該類課程著重培養(yǎng)學生使用程序設(shè)計語言和算法解決實際問題的能力,使學生深刻理解計算機自動計算工作原理,建立計算思維為特征的普遍思維模式。近幾年,Python語言以其語法簡潔、易學易用、交互性、動態(tài)性和具有豐富的第三方程序庫等特點逐漸被國內(nèi)外高校所認可,開設(shè)了大量以Python語言的載體的程序設(shè)計類課程。嵩天等提出,Python語言是程序設(shè)計課程教學改革的理想選擇[1]。

為了提高學習效率并提升教學效果,程序設(shè)計類課程均需快速對學生編寫的程序進行自動評判[2-3]。程序自動測評實現(xiàn)了批改和反饋的自動化[4-6],是維護課堂秩序、保障教學效果和提升教學質(zhì)量的重要技術(shù)手段。程序自動測評涉及到多種關(guān)鍵技術(shù),如標準輸入輸出流重定向、文件輸出重定向和管理,程序執(zhí)行時間和內(nèi)存開銷管理、GUI評測方法等等。此外,不同編程語言的程序自動評判時具有其自身的特點,本文針對Python語言程序自動評測中,被測試程序輸入輸出流的重定向問題進行研究,在分析傳統(tǒng)的基于操作系統(tǒng)輸入輸出重定向方法的基礎(chǔ)上,提出了Python偽裝文件類對象輸入輸出重定向方法,該方法在程序內(nèi)部而不是進程外部對被輸入輸出數(shù)據(jù)別進行管理,具有更強的靈活性和自主性。

1 操作系統(tǒng)輸入輸出重定向方法

學生編寫的Python程序通常包含輸入和輸出語句,程序在正常執(zhí)行時,輸入語句會阻塞程序等待用戶在標準控制臺中輸入數(shù)據(jù),輸出語句需要向標準控制臺輸出數(shù)據(jù),因此需要用戶與程序之間的交互處理。

然而在程序自動評測時,這個過程需要自動完成,在實踐中常常將標準輸入流、標準輸出流和標準錯誤流重定向到相關(guān)文件中。操作系統(tǒng)一般提供了基于文件的輸入輸出重定向功能,例如學生的Python程序為stud.py,執(zhí)行程序的命令可寫為:

Pythonstud.py< in.txt> out.txt2>&1

執(zhí)行時,文件in.txt的內(nèi)容將被重定向到標準輸入流中,因此輸入語句會從文件in.txt中直接讀取數(shù)據(jù)而無需等待用戶輸入;程序運行時產(chǎn)生的標準輸出流和標準錯誤流將重定向到文件out.txt中。

然而,由于被測試程序編寫不當導致程序陷入死循環(huán)中,并在死循環(huán)中持續(xù)向標準輸出流輸出數(shù)據(jù)時,如不對輸出數(shù)據(jù)尺寸進行限制,會在短時間內(nèi)產(chǎn)生超大尺寸文件而占滿磁盤空間導致系統(tǒng)崩潰。以筆者電腦為例,CPU為Intel Core i7-8565U 1.8 GHz,內(nèi)存8 G,硬盤512 G。在每次循環(huán)中分別輸出32字節(jié)、64字節(jié)、128字節(jié)和256字節(jié)的數(shù)據(jù),程序運行5秒后被強制關(guān)閉。每種情況下均實驗20次并統(tǒng)計平均值,程序產(chǎn)生輸出數(shù)據(jù)文件尺寸,如圖1所示。

隨著單次輸出字節(jié)數(shù)的增加,程序產(chǎn)生輸出文件的尺寸也隨之增大,兩者之間基本呈線性關(guān)系。以單次輸出128字節(jié)為例,程序運行5秒產(chǎn)生733 M字節(jié)數(shù)據(jù),平均1秒產(chǎn)生146.6 M字節(jié)的數(shù)據(jù)。可見必須采取措施對傳向標準輸出流的數(shù)據(jù)字節(jié)數(shù)進行限制。

操作系統(tǒng)輸入輸出重定向方式的優(yōu)點是:1)由操作系統(tǒng)直接支持,無需改動已編好的程序;2)使用文件作為重定向的源和目標,配置和查看數(shù)據(jù)非常方便。但這種方式也存在一些缺點,主要體現(xiàn)在:1)輸入數(shù)據(jù)需要提前保存在相關(guān)文件中,程序運行時輸出數(shù)據(jù)也將寫入指定文件,不僅占用磁盤空間,頻繁文件讀寫也易造成磁盤損壞;2)輸入數(shù)據(jù)通過文件讀取而非通過程序接口讀取,缺乏可編程能力,靈活性較弱;3)輸出數(shù)據(jù)流向文件寫入時未加入任何限制措施,若測試程序陷入死循環(huán),可能導致輸出文件尺寸過大而占滿磁盤空間,影響系統(tǒng)運行的穩(wěn)定性。

2 Python偽裝文件類對象輸入輸出重定向方法

筆者從Python的動態(tài)性和Python文件類對象接口角度出發(fā),提出了基于偽裝文件類對象的輸入輸出重定向方法,這種方法將Python程序內(nèi)部的標準輸入流對象(sys.stdin)、輸出流對象(sys.stdout)和錯誤流對象(sys.stderr)等對象引用重置到自行實現(xiàn)的偽裝的文件類對象,實現(xiàn)了更加普遍適用的重定向方式,解決了上面提出的各種問題。

實現(xiàn)原理為:由于Python的動態(tài)性,Python中任何在方法上與文件類似的對象都可以充當標準流,這與對象的實際數(shù)據(jù)類型無關(guān),而取決于接口(也被稱為協(xié)議)。具體來說,任何定義了類似于文件write方法的對象都可以賦值給sys.stdout,則所有標準輸出數(shù)據(jù)將發(fā)送到該對象的write方法上;任何定義了類似于文件read方法的對象都可以賦值給sys.stdin,則所有標準輸入數(shù)據(jù)將通過該對象的read方法獲取。由于Python中的input和print兩個輸入輸出函數(shù)只是簡單的調(diào)用sys.stdin和sys.stdout所引用對象的write和readline方法,而程序運行錯誤也是通過sys.stderr所引用對象的write方法輸出,因此我們可以使用該技術(shù)設(shè)計實現(xiàn)偽裝文件類對象來攔截標準輸入輸出流和錯誤流。

偽裝輸入文件類對象的程序為:

class Input:

def __init__(self, data=[]):

self.data = data

self.index = 0

def readline(self):

if self.index

text = str(self.data[self.index])

self.index+=1

else:

text = ''

return text

偽裝輸入文件類類名為Input,對象初始化方法__init__一方面設(shè)定數(shù)據(jù)列表,將其存儲在self.data屬性中,這個列表表示輸入流中可被讀取的數(shù)據(jù)行,列表的每一個元素代表一行數(shù)據(jù);另一方面設(shè)定待讀取數(shù)據(jù)的位置self.index為0,表示即將要讀取列表中下標為0的元素數(shù)據(jù)。

被測試程序運行前,需要使用Input類的實例對象對sys.stdin變量賦值,修改標準輸入流向。如sys.stdin = Input([10,20,'abc']),列表中的3個元素表示輸入流中的3行數(shù)據(jù)。被測試程序執(zhí)行input函數(shù)時,會調(diào)用上述實例對象的readline方法,讀取列表中的下一個數(shù)據(jù)。如果列表的所有數(shù)據(jù)都已讀完,則readline返回空字符串,表示沒有讀到數(shù)據(jù)。偽裝輸入文件類的設(shè)計使得輸入數(shù)據(jù)不需要提前寫入文件,而是采用Python標準數(shù)據(jù)結(jié)構(gòu)的形式保存,操作和讀取都具有很高的靈活性。比如Input([10,20,'abc']*3),對輸入數(shù)據(jù)列表進行運算,快速產(chǎn)生9行輸入數(shù)據(jù)。

偽裝輸出文件類對象的程序為:

class Output:

def __init__(self,MaxSize=4096):

self.MaxSize = MaxSize

self.text = ''

def write(self,text):

n = self.MaxSize-len(self.text)

if n>0:

self.text += text[0:n]

偽裝輸出文件類類名為Output,對象初始化方法__init__可設(shè)定輸出文件的最大尺寸self.MaxSize,默認輸出文件最大尺寸限制為4K字節(jié)。當程序向輸出流中發(fā)送數(shù)據(jù)時,會調(diào)用該類實例對象的write方法,將輸出數(shù)據(jù)寫入對象的self.text屬性。write方法累計統(tǒng)計輸出數(shù)據(jù)字節(jié)數(shù),若超過了最大尺寸self.MaxSize的預設(shè)值,超出部分的數(shù)據(jù)將被丟棄。

另外,被測試程序運行前,需要使用Output類的實例對象對sys.stdout變量賦值,修改標準輸出和標準錯誤流向。如sys.stdout = Output() ; sys.stderr = sys.stdout。被測試程序執(zhí)行時,print函數(shù)等向標準輸出流以及程序出錯時向標準錯誤流發(fā)送的數(shù)據(jù)會被發(fā)送到上述實例對象,保存到self.text屬性中。被測試程序結(jié)束后,可以通過讀取上述實例對象的self.text屬性獲取程序?qū)嶋H輸出。偽裝輸出文件類的設(shè)計使得程序輸出不是寫入文件中,而存儲在內(nèi)存中,不占用磁盤空間,而且可以嚴格限制輸出數(shù)據(jù)最大字節(jié)數(shù),確保系統(tǒng)穩(wěn)定運行。

3 總結(jié)

本文針對Python語言程序自動評測中,被測試程序輸入輸出流的重定向問題進行研究,闡述了傳統(tǒng)的基于操作系統(tǒng)的輸入輸出重定向方法,分析和總結(jié)了這種方法的缺點與不足,并基于Python的動態(tài)性提出了Python偽裝文件類對象輸入輸出重定向方法,通過設(shè)計實現(xiàn)滿足標準輸入輸出流接口特性的文件對象,在Python程序內(nèi)部接管輸入流和輸出流數(shù)據(jù),有效改善輸入輸出重定向的靈活性。該方法在實際應用中效果良好,對其它程序語言自動測評中輸入輸出流重定向問題的研究也具有一定的啟發(fā)性作用。

參考文獻

[1] 嵩天,黃天羽,禮欣.Python語言:程序設(shè)計課程教學改革的理想選擇[J].中國大學教學,2016(2):42-47.

[2] Kurnia A,Lim A,Cheang B. Online judge[J]. Computers & Education,2001,36(4): 299-315.

[3] 杜祥軍,李建波,李敏,等.基于Online Judge的計算機類課程教學評價方法研究[J].計算機教育,2019(3):55-57.

[4] 陳榮欽,胡永良,應建健,等.在線評測系統(tǒng)中的源碼相似度檢測研究與實現(xiàn)[J].實驗技術(shù)與管理,2014,31(4):109-111.

[5] 崔舒寧,吳寧,葉丹.建立抽象語法樹模型評測C++代碼[J].計算機應用,2015,35(S1):183-185.

[6] 張曉瑩,盧衛(wèi),程一艦,等.面向慕課的在線SQL自動評測系統(tǒng)及應用[J].實驗技術(shù)與管理,2018,35(4):16-22.

(收稿日期: 2019.08.26)

甘泉县| 昆山市| 昌平区| 岚皋县| 南阳市| 新宾| 江陵县| 新竹县| 虞城县| 青神县| 青龙| 新昌县| 连城县| 灌阳县| 应城市| 武城县| 夏河县| 织金县| 高要市| 宁都县| 满洲里市| 大同县| 石河子市| 尼玛县| 招远市| 来安县| 高碑店市| 镇远县| 沭阳县| 凯里市| 鸡泽县| 无棣县| 会理县| 衡水市| 淳安县| 米林县| 荃湾区| 故城县| 灵武市| 宝坻区| 昌都县|