基于URL Procotol协议启动python程序(包括传参)


基于URL Procotol自定义协议启动本地程序(py)

由于自定义url只能接受传单个参数或者不传,而我本地已经写好的脚本有多个参数需要传递,因此通过这个博客记录踩的坑。
(!!!最坑的就是我发现传参的时候会包括协议头一起传下来!!!当然也有可能是reg编写那有别的方式,但目前我就只能再处理一层)

1. 基本流程

主要的基本流程如下:

  • 准备一个reg文件,设置与url相关联的程序(XXX.bat,XXX.exe…)和url协议头aa;
  • 不传参或者传单个参数,则直接在浏览器中输入a://XXX.bat调用程序;如果是传多个参数,则需要中间包一层再处理。具体看下面分类介绍

2.自定义url,编写注册表信息

这个是每种情况都需要做的第一步。只是启动的程序不同;多个参数传递后面会介绍。
1.新建一个txt文件,输入如下内容。

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\Algo]
    @="URL: Algo Protocol Handler"
    "URL Protocol"=""

    [HKEY_CLASSES_ROOT\Algo\DefaultIcon]
    @="XXX"

    [HKEY_CLASSES_ROOT\Algo\Shell]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open\Command]
    @="\"C:\\XXX\" \"%1\""
  • 代码中Algo是我定义的协议头,这个随便,自己定一个就好。
  • Command下XXX(比如C:\\Users\\jelly\\one\\one.bat\)是需启动程序所在的位置,需要绝对路径,可以是bat或者exe文件。
  • 传单个参数或者多个参数都按照上述方式修改,若不传参数则将最后一行改为@="XXX"即可。

2.将文件txt后缀改为reg,双击执行即可。
3.通过在命令提示符中输入regedit,打开注册表,则可以在HKEY_CLASSES_ROOT看见如下结构。
在这里插入图片描述

3 启动本地py程序

本地py文件是无法直接链接到注册表的,且按上述1%传递下来的参数是整个带协议头的url。接下来通过例子来说明,本地py项目的启动文件为main.py,一般调用方式是python main.py -i XXX -o XXX
主要是通过如下两种方式实现:

  • 将py打包为exe文件,再直接链接到注册表(在程序内部处理整个字符串,需要改程序输入的处理)。
  • 通过bat文件启动process.py(将传入的url参数拆分为对应于本地py程序的输入参数,再调用本地py程序)。
3.1 基于EXE文件的启动

使用的reg注册信息如下:

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\Algo]
    @="URL: Algo Protocol Handler"
    "URL Protocol"=""

    [HKEY_CLASSES_ROOT\Algo\DefaultIcon]
    @="C:\\Users\\jelly\\one\\main.exe"

    [HKEY_CLASSES_ROOT\Algo\Shell]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open\Command]
    @="\"C:\\Users\\jelly\\one\\main.exe\" \"%1\""
  • 由于url传参是传递整个url,如Algo://i=C:/Users/jelly/one/data/&o=C:/Users/jelly/one/result/,main函数接收到的参数是整个字符串。因此需要改main函数的输入接口,并在main函数内部使用split等分解字符串。启动命令被改成了main.py XXX
  • 通过pip installer pyinstaller下载pyinstaller
  • 通过命令pyinstaller -F XXX.py打包main.py文件,找到main.exe(一般在生成的dist文件夹内)
  • 在浏览器输入Algo://i=C:/Users/jelly/one/data/&o=C:/Users/jelly/one/result/,即可。

踩过的坑:

  • 如果想要去验证一下可行性,一定要使用能看到功能的。比如新建个txt文件等等之类的。
  • 千万不要在url网址里面加空格,双引号,\等之类的,url会将它们变成编码。
  • 即使是windows粘过来的路径,最好将盘符改为/,也方便后面python内部识别。
  • 针对于路径,一定不要有中文(应该也有别的处理方式,这里没有深究)
3.2 基于Bat文件的启动

因为项目需要,代码需要传多个参数;且因为算法过多,改接口的工作量较大。故通过增加一个process.py处理传入的字符串,将其拆分成多个参数直接传递给main.py并调用。
流程:
1.编写reg文件链接至XXX.bat文件。reg内容如下,与上面一致。

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\Algo]
    @="URL: Algo Protocol Handler"
    "URL Protocol"=""

    [HKEY_CLASSES_ROOT\Algo\DefaultIcon]
    @="C:\\Users\\jelly\\one\\main.exe"

    [HKEY_CLASSES_ROOT\Algo\Shell]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open]

    [HKEY_CLASSES_ROOT\Algo\Shell\Open\Command]
    @="\"C:\\Users\\jelly\\one\\main.exe\" \"%1\""

2.编写XXX.bat文件启动process.py文件。bat内容如下:

@ECHO OFF
ECHO param=%1
python C:\Users\jelly\one\process.py %1
PAUSE

3.编写process.py文件启动本地main.py文件。process.py文件就只是将传入的参数拼接成main需要的参数param(如-i XXX -o XXX),然后通过subprocess调用main.py param,并将,我写的太冗余了,就不放内容了。

(如果想用docker容器,可以通过subprocess执行docker run命令启动脚本)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值