我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!。
背景
如果你想写Python,但是电脑里没装Python,不想花时间去安装Python,又或者你没带电脑只有手机和Pad,可能没办法直接安装Python,怎么办呢?
在这个问题背景下,我们不能要求用户安装任何APP,我们只能依赖用户电脑/手机/Pad上一定有的APP:浏览器。
技术选型
方案一:远程Python环境
我们需要准备一些后端容器,预装了Python环境。
每当用户需要调试Python代码时,就在浏览器输入Python代码,浏览器发请求告诉预装了Python环境的服务器,服务器执行后将结果告诉浏览器,展现给用户。
但是缺陷也很明显:非常占用服务器资源。
因为你要实现这种方式,最重要的点是:环境隔离。
- 用户执行了一次代码,可能定义了一些函数,可能执行了一些复杂计算操作保存在了全局变量,服务器不能丢弃它,只要用户没有关掉浏览器,服务器必须一直保存着这些全局变量和函数。
- 不同用户之间,需要环境隔离。如果你允许用户调用系统相关命令,例如
os里的文件写操作,那么一定要是系统级别的隔离。因为这种情况下你不能让用户A的代码影响到用户B的代码。你可以用Docker实现,每个用户的一次Python会话对应一个container。如果你屏蔽了系统相关调用,则需要每个用户的一次Python会话对应一个进程。
这就导致什么结果?服务器成本倍增。用户量越大,占用的服务器资源越多。而如果你提供免费服务,这绝对是个亏本买卖。还有可能会被坏人钻了漏洞,拿去挖矿。
方案二:在浏览器JS环境中运行Python
如果我们不用服务器,在浏览器环境下就能运行Python,那方案一的问题就迎刃而解了。
有一个JS库叫Brython,实现了该方案。
最近码上掘金也提供了语法高亮的支持。所以,今天,我可以用码上掘金实现一个网页版Python Shell了!
展示
- 你只要在textarea中输入Python代码,然后可以点击
Run执行。定义的全局变量、函数都会保存下来。 - 你可以调用Python内置基础库,做一些交互。
- 你可以调用
print函数,把一些变量的值、表达式计算结果输出,会展示在DOM上。 - 你可以在这里用Python做一些算法题,不依赖其它服务器资源,在你当前的设备没装Python时,非常便捷。
写个斐波那契数列
定义函数:
def fib(n):
if n < 3:
return 1
return fib(n - 1) + fib(n - 2)
测试输出:
for i in range(1, 11):
print(i, fib(i))
另一个版本的网页Python Shell
这个看起来更高级一些,是Brython官方提供的。而且用起来跟真正的Python shell体验相近。
限制
- 不能安装库,如果要用,你必须先用JS实现一遍它。
- 不能访问系统相关函数,因为浏览器的限制,你不能访问本地文件。JS做不到的事情,在网页中的Python都做不到。
这些限制,也注定了Brython的前景非常有限。它只是好玩,没有引入服务器成本运行Python,但是对于前端开发、后端开发,都不喜欢。它面对一个窘境:JS不能做的,Brython都不能做;JS能做的,Brython可能做不到。此外,Brython声称可以操作DOM,但是前端开发者会JS就够了不想学Brython的DOM API,后端开发者不会DOM,也不愿意去看。最终,它可能永远只是个好玩的玩具。
聊聊码上掘金
最近看到码上掘金支持了Custom语言,主要是支持了在码上掘金内编写其它语言,包括Python、lua、Ruby、SQL等,目前官方浅浅的推广了几个月了,但是效果似乎不太理想,似乎没有后端开发愿意使用它。
这其实是我上文提到的Brython的限制所决定的。
但不得不承认,码上掘金支持后端代码开发,是掘金的勇敢而伟大的尝试。只是为了降低服务器成本,官方选择了方案二。
但是今天我又研究了一下,发现官方对方案一,也支持了!而且通过Docker实现了环境隔离!不愧是掘金!
码上掘金思路如下:用户开发代码后,把源码通过WebSocket发送给服务器,服务器做编译(如果需要编译就编译)、执行。等执行完毕后,把执行结果通过WebSocket推送给前端。
支持的语言有Python、Golang、C++、Java、PHP等。下面我实现了基于方案一的斐波那契数列,你可以打开Network面板,重新运行下面代码,看看那个WebSocket请求。
写在最后
我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,联系我,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋、UNO等游戏,不收费无广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这2个专栏里分享:《教你做小游戏》、《极致用户体验》。