前幾天粗蔚,一個朋友提出了一個建議,如何用python寫出python的解釋器饶火,我感覺這是一個很好的問題鹏控,于是就去看看,打算用python寫一個試試肤寝,后來我發(fā)現(xiàn)一個事情当辐,python里面的subprocess算是一個很有趣的東西,他可以解釋python自己的代碼鲤看,之后就有個想法了瀑构,嘗試用subprocess去寫一個在線運行python的網(wǎng)站。
私信回復(fù)【PDF】可獲取python電子書一套
那今天我們就來分享一下刨摩,如何使用python去寫一個在線python吧!
首先世吨,這個東西是結(jié)合python的flask框架來完成的澡刹。先介紹一下flask框架:
Flask也被稱為 “microframework” ,因為它使用簡單的核心耘婚,用 extension 增加其他功能罢浇。Flask沒有默認使用的數(shù)據(jù)庫、窗體驗證工具沐祷。然而嚷闭,F(xiàn)lask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM赖临、窗體驗證工具胞锰、文件上傳、各種開放式身份驗證技術(shù)兢榨。
使用終端嗅榕,運行命令提示符CMD顺饮,執(zhí)行:
pip install Flask
在做我們的工作之前先來了解一下flask框架是怎樣的一個運行機制吧:
首先創(chuàng)建一個flaskrun.py文件(先寫個demo,后面在這個基礎(chǔ)上改改凌那,就可以作為網(wǎng)站后端的接口了)
每個函數(shù)的上面都有修飾器,這個就代表他的路由帽蝶,比如說@app.route('/'),它就指定了赦肋,下面這個函數(shù)所在的地址是127.0.0.1:5000/(默認端口是5000,可以手動在run方法中修改)
這個文件運行首先我們在沒設(shè)置app文件的情況下励稳,需要先設(shè)置一下佃乘,并且開成調(diào)試模式,再去運行:
run了之后恕稠,服務(wù)會起了,就會跳出這樣的界面扶欣。
那我們現(xiàn)在就可以去訪問路由了,現(xiàn)在我們想訪問index方法料祠,我們就輸入路由:
如果我們想訪問hello方法,這個時候我們就需要加上/hello的路由了:
這樣我們就進入了/hello的方法了敛苇,每個方法對應(yīng)一個路由,包含最后一個post也是一樣:
下面我們還要介紹的是報錯機制:
在路由或者訪問數(shù)據(jù)不對的情況下枫攀,我們一般得不到正確的結(jié)果,這個時候我們就需要來看看flask對于錯誤是如何進行解釋的了株茶。
flask對于錯誤也有個修飾器来涨,叫@app.errorhandler() ,括號里面跟錯誤代碼启盛,例如蹦掐,無法找到頁面就可以這么寫:@app.errorhandler(404)
當然還有一些其他的錯誤僵闯,例如400卧抗,500,405等錯誤鳖粟,我們都可以捕捉:
ok,flask介紹完畢牺弹,我們下面進入正軌了浦马,用subprocess來寫python了时呀。創(chuàng)建一個文件叫:pyol.py
首先導(dǎo)入要用的包:
import os,sys,subprocess,tempfile,time (敲代碼的時候建議大家還是分開敲,連起來寫雖然也支持晶默,但是事實上是不規(guī)范的谨娜,建議分開寫)
在這里我們還需要用到臨時文件夾,這個文件夾我們在運行python的時候會用到磺陡。
下面一點比較關(guān)鍵的是,我們需要用到sys模塊里的executable方法來獲取python編譯器的位置(就是它币他,才能解讀python代碼)
EXEC=sys.executable
下面我們需要定義編碼方式:
在默認情況下都是以utf-8的情況下進行編碼。
下面我們需要將用戶寫進來的python代碼寫入文件:
下面我們需要在在一個主函數(shù)中定義執(zhí)行方法彰阴,我們此時就需要用到subprocess 的check_output方法返回子進程的輸出結(jié)果(check_output 是 父進程等待子進程完成,返回子進程向標準輸出的輸出結(jié)果 )
將返回結(jié)果輸出:
r['output'] = outdata
最后退出程序并刪除文件:
但是實際上這個臨時文件本身也會自動刪除,這步其實也算是多余的庆杜。這樣我們的python就寫好了射众。下面只需要把它加入路由,把用戶輸入的數(shù)據(jù)以post的方式提交即可晃财。
我們在flaskrun.py文件里導(dǎo)入以下模塊:
我們需要定義一個返回的頭部:
之后我們來寫post請求的接口:
我們指定他的路由為/run罗洗,采用post的方式傳遞數(shù)據(jù),調(diào)用剛剛寫的主函數(shù)的執(zhí)行代碼钢猛,來執(zhí)行用戶傳入的code栖博,最后將執(zhí)行結(jié)果返回給用戶。
最后我們運行代碼:
最后完整加上優(yōu)化后代碼如下:
pyol.py
flaskrun.py
我們現(xiàn)在需要借助postman來看一下run的結(jié)果躺翻,首先我們先run一下代碼
(flask run):
之后我們打開postman
瞬間就完成了公你。
之后我們只要寫個前端,把這個接口給前端調(diào)就大功告成了假瞬!