Mac OS X下通过URL Scheme方式调用Python并传参

Windows下我们可以通过注册表的方式打开Python exe,并通过%1占位符的方式传递参数给Python程序,相对比Mac下要容易。今天我们不讨论Windows下如何调用Python及传递参数,打算以后再写吧,今天的重点是Mac OS X如何调用Python App并传递参数。

Mac OS X下是没有注册表的概念,通过浏览器调用Python App可以用info.plist的URL Scheme的方式调起,再用Python的Pyqt5技术实现,下面是具体实现细节:

一、Python打包App并修改info.plist

Mac OS X下Python打包我推荐Pyinstaller + spec,如果Python文件不多,就不用spec了,如果做项目Python源码很多,那就必须要写spec,相当于打包批量脚本,配置好一键打包,很方便,这个不在这里讨论,有需要的留言我可以发你。等Python打包成App之后,里面就有个info.plist,修改plist文件增加以下内容,或者用xcode增加也可以。

	<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>testlogin1</string>
            </array>
            <key>CFBundleURLName</key>
            <string>testlogin2</string>
        </dict>
    </array>

testlogin2这组可以删掉,这样我们的访问URL就是:

testlogin1://?token=3OTkzNGQ0Njc5MTRkMmI4NmU4NDM2ZmUwN

二、通过Python Pyqt5接收参数

Python Pyqt5接收参数的核心思想是QApplication的事件监听(核心),一定要监听的QApplication的事件动作,而不是应用内的某个QWidget组件。除了用Python Pyqt5实现外,用C++ QT也可以实现,这个比Python还要容易,我有写好代码,有需要的也可以留言。

核心代码:

    def event(self, a0) -> bool:
        if a0.type() == QEvent.FileOpen:
            log_info('进入 QEvent.FileOpen方法成功-------SUCCESS')
            analysis(str(a0.url()))
        return super().event(a0)

当我们通过浏览器调起Python App的时候,会触发event的QEvent FileOpen事件,事件ID是116,这时接收到event中是有完整的请求URL的,格式如下:

PyQt5.QtCore.QUrl('testlogin1://?token=3OTkzNGQ0Njc5MTRkMmI4NmU4NDM2ZmUwN')

通过正则或者字符串截取就很拿到URL请求参数了,你学废了吗?

举报
评论 0