不安装Python环境,也能写Python代码,手机Pad电脑上都可以!送你码上掘金版Python Shell!

6,889 阅读5分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

背景

如果你想写Python,但是电脑里没装Python,不想花时间去安装Python,又或者你没带电脑只有手机和Pad,可能没办法直接安装Python,怎么办呢?

在这个问题背景下,我们不能要求用户安装任何APP,我们只能依赖用户电脑/手机/Pad上一定有的APP:浏览器。

技术选型

方案一:远程Python环境

我们需要准备一些后端容器,预装了Python环境。

每当用户需要调试Python代码时,就在浏览器输入Python代码,浏览器发请求告诉预装了Python环境的服务器,服务器执行后将结果告诉浏览器,展现给用户。

image.png

但是缺陷也很明显:非常占用服务器资源。

因为你要实现这种方式,最重要的点是:环境隔离

  1. 用户执行了一次代码,可能定义了一些函数,可能执行了一些复杂计算操作保存在了全局变量,服务器不能丢弃它,只要用户没有关掉浏览器,服务器必须一直保存着这些全局变量和函数。
  2. 不同用户之间,需要环境隔离。如果你允许用户调用系统相关命令,例如os里的文件写操作,那么一定要是系统级别的隔离。因为这种情况下你不能让用户A的代码影响到用户B的代码。你可以用Docker实现,每个用户的一次Python会话对应一个container。如果你屏蔽了系统相关调用,则需要每个用户的一次Python会话对应一个进程。

这就导致什么结果?服务器成本倍增。用户量越大,占用的服务器资源越多。而如果你提供免费服务,这绝对是个亏本买卖。还有可能会被坏人钻了漏洞,拿去挖矿。

方案二:在浏览器JS环境中运行Python

如果我们不用服务器,在浏览器环境下就能运行Python,那方案一的问题就迎刃而解了。

image.png

有一个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))

image.png

另一个版本的网页Python Shell

这个看起来更高级一些,是Brython官方提供的。而且用起来跟真正的Python shell体验相近。

限制

  1. 不能安装库,如果要用,你必须先用JS实现一遍它。
  2. 不能访问系统相关函数,因为浏览器的限制,你不能访问本地文件。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请求。

image.png

写在最后

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,联系我,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋、UNO等游戏,不收费无广告。还独立开发了《合成大西瓜重制版》。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这2个专栏里分享:《教你做小游戏》《极致用户体验》