基于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
命令启动脚本)