M与Python交互

在某些方面强大的同时,在其他方面必然存在一些不足,任何语言都不例外。
比如进行大位数运算,在Excel和Power Query中的数字都有位数限制,100的阶乘,是一个很大的数字了,直接算的话就会变成科学记数法,得不到精确的结果。

而在Python中是没有这个限制的,所以Power Query做不到的,我们可以交给Python去做。
但我们最终希望把Python的运算结果返回到PQ中,那么就差一个接口。

之前在《Power Query网抓详解》中提过,Python是可以搭建Web框架的语言,常见的有Django等框架,今天我们来介绍一个轻量级的微型框架bottle。
需要先安装bottle,可以用pip等方式安装,pip install bottle
以上面的阶乘为例,所以还需要用到numpy包,直接上Python代码:

from bottle import *
import numpy
@route('/fact/:num')
def fact(num):
    return str(numpy.math.factorial(int(num)))

run(host='localhost', port=8080)

运行后,打开浏览器,输入http://localhost:8080/fact/100,看下发生了什么:

代码中第三行"fact/:"后面的num表示前台输入的参数,带入到自定义函数中,经过Python运算后返回结果。我们刚才输入的是100,改成其他数便会返回对应的结果。

那么下面就很简单了,再使用Power Query中的Web.Contents来模拟浏览器请求,结果便会返回到PQ中。

最后再把100改为变量,封装为自定义函数即可。
我们在PQ中使用自定义函数fact,输入任何数都能返回正确的结果,试下999:

let
    fact = (x)=>Text.FromBinary(Web.Contents("http://localhost:8080/fact/"&Text.From(x))),
    result = fact(999)
in
    result


输入的999首先通过PQ中的自定义函数传递到URL中,发送请求,Web框架收到请求后,把参数传入到Python中,然后再传入Python的自定义函数中,运算得到结果,返回响应给PQ。

讲这个案例的目的当然不仅仅只是介绍如何算阶乘,而是提供一种新思路,让PQ中的参数能够传递到Python中,形成两个语言的交互。根据这个思路,我们只需要修改Python代码中自定义函数也就是def后面的部分,便能轻松实现大量原本PQ无法实现的功能。

9 Replies to “M与Python交互”

  1. 这个神奇了,根据你三个月前的建议,我也开始学习了python了,现在基本能抓取淘宝80%的页面了,比如聚划算,品牌团,搜索,评价。。。。。,之前也一直关注你的pq,结合用非常好,今天你提供的这种思路,太好了,非常感谢分享 ,感谢

  2. 是否要调用Python 要通过以下这个方法呢
    Text.FromBinary(Web.Contents("http://localhost:8080/fact/"

  3. 我请求的数据有点多报错了,这个有办法解决吗?
    127.0.0.1 - - [15/Mar/2019 00:46:37] code 414, message Request-URI Too Long

    我百度了一下网上说http协议本身没有对URL长度做限制

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注