Python:os.system传递列表的列表参数时被拆分的问题解决
这个坑我之前踩过!核心原因是os.system()会把整个命令字符串交给系统Shell去解析,Shell会自动按空格、逗号这些分隔符拆分参数——你的嵌套列表转成字符串后,里面的逗号和空格都会被Shell当成参数分隔符,自然就把结构打乱了;而你直接在Shell里执行时,其实是手动用引号把参数包起来了,所以Shell会把它当成单个参数处理。
下面给你两种靠谱的解决办法:
最推荐:改用subprocess模块
subprocess是Python官方推荐替代os.system的工具,它可以直接传递参数列表,完全绕过Shell的解析逻辑,从根源上避免参数拆分问题。
举个完整的例子:
假设你要调用的目标脚本target_script.py是这么接收参数的:
# target_script.py import sys import ast # 将收到的字符串参数转回嵌套列表 nested_list = ast.literal_eval(sys.argv[1]) print("完整接收的嵌套列表:", nested_list) print("结构类型:", type(nested_list))
如果用os.system的错误写法(会直接拆结构):
import os my_nested_list = [[1,2,3], [4,5,6], [7,8,9]] # 直接转字符串传给os.system,会被Shell拆分 os.system(f"python target_script.py {my_nested_list}")
换成subprocess.run的正确写法:
import subprocess my_nested_list = [[1,2,3], [4,5,6], [7,8,9]] # 把嵌套列表转成字符串,作为单个参数放进命令列表 cmd = ["python", "target_script.py", str(my_nested_list)] subprocess.run(cmd, check=True)
这样执行后,target_script.py能完整拿到嵌套列表的字符串,再用ast.literal_eval转回原结构就可以了。
非要用os.system?手动做参数转义
如果你因为某些限制必须用os.system,那得把嵌套列表的字符串用Shell能识别的方式转义,保证它被当成单个参数传递。可以用shlex.quote()帮你自动生成符合Shell规则的转义字符串:
import os import shlex my_nested_list = [[1,2,3], [4,5,6], [7,8,9]] # 转义参数,避免被Shell拆分 escaped_arg = shlex.quote(str(my_nested_list)) os.system(f"python target_script.py {escaped_arg}")
不过这种方式不如subprocess可靠——不同系统的Shell转义规则可能有差异,所以还是优先推荐用subprocess。
额外小技巧:用JSON传递更稳妥
如果你的嵌套列表里有字符串、布尔值这类复杂类型,用ast.literal_eval可能会有风险,换成JSON序列化/反序列化兼容性更好:
发送端:
import subprocess import json my_nested_list = [[1,"hello",True], [4,5,6], [7,8,9]] json_str = json.dumps(my_nested_list) cmd = ["python", "target_script.py", json_str] subprocess.run(cmd, check=True)
接收端:
# target_script.py import sys import json nested_list = json.loads(sys.argv[1]) print("完整接收的嵌套列表:", nested_list)
内容的提问来源于stack exchange,提问作者Amardeep Mishra

