Python脚本直接运行时sys.argv未获参数,如何区分两种运行方式?
解决方案与两种场景的区分方法
先搞定参数丢失的根本问题
Windows下直接运行.py脚本拿不到参数,本质是默认的Python文件关联没设置传递参数。按下面步骤修复:
- 打开管理员权限的命令提示符,执行两条命令(把Python路径换成你自己的实际路径):
改完之后再直接运行assoc .py=Python.File ftype Python.File="C:\你的Python路径\python.exe" "%1" %*myscript.py 1 2 3,就能正常获取参数了。
区分「真没传参数」和「没加Python命令导致参数没传进来」
要是暂时不想改系统设置,或者需要在脚本里自动判断这两种情况,可以调用Windows的API拿到原始命令行来分析:
#!/usr/bin/python3 import sys import ctypes from ctypes import wintypes # 调用Windows内核API获取完整原始命令行 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) kernel32.GetCommandLineW.restype = wintypes.LPCWSTR raw_command_line = kernel32.GetCommandLineW() print("Python接收的参数:", sys.argv) print("系统收到的完整命令行:", raw_command_line) # 判断逻辑 if len(sys.argv) == 1: # 检查原始命令行里脚本路径后面有没有额外内容 script_full_path = sys.argv[0] if len(raw_command_line) > len(script_full_path) and not raw_command_line.endswith(script_full_path): print("情况:用户传了参数,但因为文件关联问题,Python没收到") else: print("情况:用户确实没传任何参数")
当你直接执行myscript.py 1 2 3时,sys.argv只有脚本路径,但raw_command_line会显示完整的命令内容,这样就能准确区分两种场景了。
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

