为何Python的argv会将脚本文件名纳入参数列表?
解决
sys.argv脚本文件名作为参数的困惑 嘿,我完全懂你现在的疑惑——刚接触sys.argv的时候,它把脚本文件名算成第一个参数的设计确实容易让人踩坑!
先搞懂sys.argv的本质
sys.argv是一个列表,其中第一个元素永远是你运行的脚本文件的名字,剩下的元素才是你在终端里传入的实际参数。比如你运行:
python another_test.py hi
这时候argv的内容是['another_test.py', 'hi'];如果传入两个参数:
python another_test.py hi there
argv就变成了['another_test.py', 'hi', 'there']。
你的代码问题分析
你写的value1, value2 = argv是在告诉Python:“把argv里的两个元素分别赋值给这两个变量”。但实际情况是:
- 当你传入两个参数时,
argv有3个元素,尝试解包成2个变量自然会抛出ValueError: too many values to unpack (expected 2); - 当你传入一个参数时,
argv有2个元素,所以value1拿到了脚本文件名,value2拿到了你传入的参数,这和你的预期完全相反。
解决方案
有两种简单的方式处理这个问题:
1. 显式跳过脚本文件名
用一个占位变量(通常用_表示我们不需要这个值)来接收脚本文件名,剩下的变量接收实际参数:
from sys import argv # _ 用来接收脚本文件名,我们不需要用到它 _, value1, value2 = argv print("Hi") print("you seem bored") print(value1) print(value2)
现在运行python another_test.py hello world,value1会是hello,value2是world,完全符合你的预期。
2. 用切片获取所有实际参数
如果你不确定传入参数的数量,或者想灵活处理,可以用argv[1:]来获取除了第一个元素(脚本名)之外的所有参数:
from sys import argv # 获取所有用户传入的参数 user_args = argv[1:] print("Hi") print("you seem bored") # 确保有足够的参数再打印 if len(user_args) >= 2: print(user_args[0]) print(user_args[1]) else: print("请传入至少两个参数哦!")
这种方式更灵活,能避免参数数量不匹配导致的报错。
小提示
以后用sys.argv的时候,记得它的第一个元素永远是脚本文件名,处理参数时一定要先跳过它,就不会再遇到这类问题啦!
内容的提问来源于stack exchange,提问作者Sorakrit Chonwattanagul
相关产品推荐
相关产品推荐

