讓Python程序在線執(zhí)行

Python Powered

引言

用python編程是我最幸福的時刻,相信有過python編程經(jīng)驗的童鞋都有體會。沒有過多的束縛,沒有過多的技巧,即使只用最平實的代碼也依然能完成想要的功能。如果可以,我真希望這輩子只用python和c編程。

長久以來native應(yīng)用為了能將新版本推送給用戶,都是采用自動更新的方案。后來出現(xiàn)了hybrid應(yīng)用,用native做個容器承載web內(nèi)容,這樣新的內(nèi)容可以直接在線載入給用戶。但hybrid應(yīng)用有一些明顯的弊端:

  1. 帶有沉重的運行時,為了能渲染web頁面,一個渲染引擎運行時就有好幾十M。
  2. 接口功能有限,因為js天生被設(shè)計為運行在沙箱里,所以較為敏感的底層接口都需要渲染引擎或者native容器提供接口進行擴展,功能性更新時web頁面更新還不夠,還得讓底層的native容器也更新。

hybrid的這些弊端native代碼都沒有,但native同樣沒有web頁面的即時推送最新內(nèi)容的能力,都說python是一個膠水語言,這個時候如果能讓python介入調(diào)和這些問題實在是再好不過了。python代碼可以即時解釋執(zhí)行,它的標(biāo)準(zhǔn)運行時只有4M,而且借助cffi使用ctypes調(diào)用底層接口實在是跟玩一樣。那擺在面前的問題顯而易見,如果能讓python腳本像web頁面一樣被即時加載解釋執(zhí)行就好了。

pygain

讓python腳本獲得web頁面的即時加載解釋執(zhí)行功能我們可以借助一個叫pygain的庫,pypi上的地址是: pygain。可以直接使用pip install pygain安裝,使用pygain只需要import pygain加載即可,現(xiàn)在假設(shè)我們要加載一個存放在遠(yuǎn)程服務(wù)器上叫hello.py的腳本在http://oeb1qxnpc.bkt.clouddn.com/hello.py,它看起來像是這樣:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author: zig(remember1637@gmail.com)

print("hello, pygain")

就是說加載這個腳本(import hello)我們將在標(biāo)準(zhǔn)輸出得到"hello, pygain"。我們在本地編寫一個測試腳本test.py:

import pygain

pygain.gain("hello", "http://oeb1qxnpc.bkt.clouddn.com", ["py"])

import hello

運行這個腳本,不出意外我們將得到"hello, pygain"的輸出。

上例中import pygain之后使用pygain.gain接口會注冊一個叫hello的頂層模塊,http://oeb1qxnpc.bkt.clouddn.com是這個頂層模塊的根地址,此后import hello或者import hello.submodule(導(dǎo)入hello的子模塊)都將以這個根地址進行遍歷尋找,這個流程與導(dǎo)入文件系統(tǒng)上的模塊沒有什么區(qū)別。["py"]說明了這次注冊后,import hello或者import hello.submodule之類的導(dǎo)入指令將會尋找的文件后綴,接下來我們會看到導(dǎo)入在線的zip包會是更普遍的場景。

一次性加載一堆python腳本

盡管我們可以把一堆python腳本扔在遠(yuǎn)程服務(wù)器上,然后使用import指令時觸發(fā)pygain類似文件系統(tǒng)的尋找規(guī)則去一一尋找需要的腳本文件,但這種方式是極其低效的:一個python腳本通常不會有多大,這樣尋找它的耗時比加載它耗時還要長。所以pygain提供了可以導(dǎo)入zip包的功能。現(xiàn)在假設(shè)我們要加載一個存放在遠(yuǎn)程服務(wù)器上叫demo.zip的包在http://oeb1qxnpc.bkt.clouddn.com/demo.zip,這個zip包的內(nèi)容是這樣:

demo.zip

/- init.py

/- hello.py

/- hello2.py

我們在本地編寫一個測試腳本test.py:

import pygain

pygain.gain("demo", "http://oeb1qxnpc.bkt.clouddn.com", ["zip", "py"])

import demo.hello2

運行這個腳本,不出意外我們將得到"hello, pygain"的輸出。

關(guān)鍵字參數(shù)

pygain還提供了一些keyword arguments(關(guān)鍵字參數(shù)):

  1. httpheaders: 用于在發(fā)送http請求時附加的http頭
  2. zippw: 用于在加載加密zip包時進行解密
pygain.gain("demo", "http://zagzig.me/pygain/demo/v1", ["zip", "py"],
  httpheaders={"Referer": "xxx"}, zippw="guesswhat")

一些場景

結(jié)合PyQt5

從我們團隊的本身實踐來講,結(jié)合PyQt使用pygain是一個有趣且高效的套路:

  1. 產(chǎn)品的安裝包總是使用pygain導(dǎo)入一個遠(yuǎn)程服務(wù)器的"引導(dǎo)腳本",之所以被稱為"引導(dǎo)腳本",是因為它本身不干啥,只是用來導(dǎo)入特定版本的zip包。
  2. 每次產(chǎn)品更新將代碼打個zip包放到一個以版本命名的文件夾,然后把"引導(dǎo)腳本"指向這個版本的zip包。
  3. 必要時還可以通過"引導(dǎo)腳本"進行版本回溯。
    PyQt提供了一整套的工具鏈以至于將資源文件都可以轉(zhuǎn)化為python文件,這樣不管是更新GUI,還是更新功能,都可以通過pygain導(dǎo)入整個zip包完成。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容