Win10下执行mapIt.py忽略命令行参数,加py前缀才生效问题排查
Windows 10环境下mapIt.py运行异常问题排查
基础环境说明
- 操作系统:Windows 10
- Python来源:微软应用商店渠道安装的Python 3.9
- 环境配置:系统PATH变量已包含待执行脚本mapIt.py的所在目录
- 运行脚本:《Python编程快速上手(Automate the Boring Stuff)》第12章配套的谷歌地图启动脚本,核心功能为从命令行或剪贴板读取地址,自动唤起浏览器打开对应谷歌地图页面
脚本核心代码如下:
#! python3 # mapIt.py - Launches a map in the browser using an address from the # command line or clipboard. import webbrowser, sys, pyperclip if len(sys.argv) > 1: # Get address from command line. address = ' '.join(sys.argv[1:]) else: # Get address from clipboard. address = pyperclip.paste() webbrowser.open('https://www.google.com/maps/place/' + address)
可复现的故障现象
- 直接在CMD中输入
mapIt.py Empire State Building,脚本可正常启动执行,但会完全忽略命令行传入的Empire State Building参数,转而读取剪贴板内容打开谷歌地图 - 在非脚本所在目录添加
py前缀执行脚本,会抛出[Errno 2] No such file or directory错误 - 切换回脚本所在目录后,直接输入
mapIt.py Empire State Building,仍存在参数被忽略的问题 - 在脚本所在目录下输入
py mapIt.py Empire State Building,脚本功能完全正常,可正确读取命令行参数,打开对应地址的谷歌地图页面
故障根因说明
- 直接输入
mapIt.py执行时,CMD不会直接调用Python解释器跑脚本,而是按照系统内登记的.py后缀文件关联规则唤起对应程序。微软应用商店安装的Python因为是沙盒打包模式,在注册文件关联时经常出现配置缺陷:写入的打开命令没有加%*参数透传标识,正常可传参的关联格式是"解释器路径" "%1" %*,如果缺了最后的%*,哪怕脚本能正常跑,所有跟在文件名后面的命令行参数都会被系统直接丢弃,导致脚本里判断命令行参数的分支永远触发不了,只能走读剪贴板的逻辑。 - 在非脚本目录加
py前缀执行报错的原因很简单:py启动器找脚本的时候只会扫描当前所在的工作目录,不会自动从PATH变量里检索脚本的存储位置,哪怕PATH里已经配置了脚本目录,只要当前目录没有对应文件,就会抛出找不到文件的错误。 - 关于Mu编辑器自带Python的干扰怀疑:这个情况基本可以排除,除非手动把Mu的内置Python路径加到了系统PATH的最高优先级位置,不然它根本抢不到系统默认的解释器调用优先级,和这次的参数丢失故障没有直接关联。
内容的提问来源于stack exchange,提问作者Cambuchi
相关产品推荐
相关产品推荐

