一個有趣的Python案例:如何用Python寫出Python的解釋器?

前幾天,一個朋友提出了一個建議,如何用python寫出python的解釋器,我感覺這是一個很好的問題,於是就去看看,打算用python寫一個試試,後來我發現一個事情,python裏面的subprocess算是一個很有趣的東西,他可以解釋python自己的代碼,之後就有個想法了,嘗試用subprocess去寫一個在線運行python的網站。

 

那今天我們就來分享一下,如何使用python去寫一個在線python吧!

首先,這個東西是結合python的flask框架來完成的。先介紹一下flask框架:

Flask也被稱爲 “microframework” ,因爲它使用簡單的核心,用 extension 增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。

使用終端,運行命令提示符CMD,執行:

pip install Flask

在做我們的工作之前先來了解一下flask框架是怎樣的一個運行機制吧:

首先創建一個flaskrun.py文件(先寫個demo,後面在這個基礎上改改,就可以作爲網站後端的接口了)

一個有趣的Python案例:如何用Python寫出Python的解釋器?學習資料也可以加下Python扣扣裙:3零4零5零799自己下載學習下。

每個函數的上面都有修飾器,這個就代表他的路由,比如說@app.route('/'),它就指定了,下面這個函數所在的地址是127.0.0.1:5000/(默認端口是5000,可以手動在run方法中修改)

這個文件運行首先我們在沒設置app文件的情況下,需要先設置一下,並且開成調試模式,再去運行:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

run了之後,服務會起了,就會跳出這樣的界面。

一個有趣的Python案例:如何用Python寫出Python的解釋器?

那我們現在就可以去訪問路由了,現在我們想訪問index方法,我們就輸入路由:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

如果我們想訪問hello方法,這個時候我們就需要加上/hello的路由了:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

這樣我們就進入了/hello的方法了,每個方法對應一個路由,包含最後一個post也是一樣:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

下面我們還要介紹的是報錯機制:

在路由或者訪問數據不對的情況下,我們一般得不到正確的結果,這個時候我們就需要來看看flask對於錯誤是如何進行解釋的了。

flask對於錯誤也有個修飾器,叫@app.errorhandler() ,括號裏面跟錯誤代碼,例如,無法找到頁面就可以這麼寫:@app.errorhandler(404)

一個有趣的Python案例:如何用Python寫出Python的解釋器?

當然還有一些其他的錯誤,例如400,500,405等錯誤,我們都可以捕捉:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

ok,flask介紹完畢,我們下面進入正軌了,用subprocess來寫python了。創建一個文件叫:pyol.py

首先導入要用的包:

import os,sys,subprocess,tempfile,time (敲代碼的時候建議大家還是分開敲,連起來寫雖然也支持,但是事實上是不規範的,建議分開寫)

在這裏我們還需要用到臨時文件夾,這個文件夾我們在運行python的時候會用到。

一個有趣的Python案例:如何用Python寫出Python的解釋器?

下面一點比較關鍵的是,我們需要用到sys模塊裏的executable方法來獲取python編譯器的位置(就是它,才能解讀python代碼)

EXEC=sys.executable

下面我們需要定義編碼方式:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

在默認情況下都是以utf-8的情況下進行編碼。

下面我們需要將用戶寫進來的python代碼寫入文件:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

下面我們需要在在一個主函數中定義執行方法,我們此時就需要用到subprocess 的check_output方法返回子進程的輸出結果(check_output 是 父進程等待子進程完成,返回子進程向標準輸出的輸出結果 )

一個有趣的Python案例:如何用Python寫出Python的解釋器?

將返回結果輸出:

r['output'] = outdata

最後退出程序並刪除文件:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

但是實際上這個臨時文件本身也會自動刪除,這步其實也算是多餘的。這樣我們的python就寫好了。下面只需要把它加入路由,把用戶輸入的數據以post的方式提交即可。

我們在flaskrun.py文件裏導入以下模塊:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

我們需要定義一個返回的頭部:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

之後我們來寫post請求的接口:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

我們指定他的路由爲/run,採用post的方式傳遞數據,調用剛剛寫的主函數的執行代碼,來執行用戶傳入的code,最後將執行結果返回給用戶。

最後我們運行代碼:

一個有趣的Python案例:如何用Python寫出Python的解釋器?

最後完整加上優化後代碼如下:

pyol.py

一個有趣的Python案例:如何用Python寫出Python的解釋器?

flaskrun.py

一個有趣的Python案例:如何用Python寫出Python的解釋器?

我們現在需要藉助postman來看一下run的結果,首先我們先run一下代碼

(flask run):

一個有趣的Python案例:如何用Python寫出Python的解釋器?

之後我們打開postman

一個有趣的Python案例:如何用Python寫出Python的解釋器?

瞬間就完成了。

之後我們只要寫個前端,把這個接口給前端調就大功告成了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章