You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在以字符串执行Python脚本时传递字符串列表作为sys.argv参数

解决方案与需求分析

无需修改脚本的可行方案

优先用subprocess替代os.system

os.system本质是调用系统shell解析命令字符串,引号转义规则复杂且跨平台不一致,这正是问题的根源。改用subprocess模块直接传递参数列表,能完全绕开shell的引号解析问题,是最可靠的方案:

import subprocess
# 直接把每个命令行参数作为列表元素传入,arg2原样传递即可
subprocess.run(["python", "script.py", "arg1", '["x?47", "b-12", "k:4"]'])

这样script.py里的sys.argv[2]就能拿到和手动执行时完全一致的字符串,不需要对脚本做任何修改。

坚持用os.system的转义方法(不推荐)

如果必须用os.system,需要根据操作系统构造正确的转义字符串:

  • Linux/macOS(Bash环境):用单引号包裹arg2,因为Bash中单引号内的所有字符都会原样保留,构造命令字符串时要确保shell最终看到的是单引号包裹的内容:
    import os
    # 用双引号包裹整个命令,内部的单引号直接保留
    cmd = "python script.py arg1 '[\"x?47\", \"b-12\", \"k:4\"]'"
    os.system(cmd)
    # 或者用单引号嵌套转义
    cmd = 'python script.py arg1 \'["x?47", "b-12", "k:4"]\''
    os.system(cmd)
    
  • Windows(CMD环境):CMD的引号规则更特殊,需要用双引号包裹arg2,内部的双引号用""转义:
    import os
    cmd = 'python script.py arg1 "[\"\"x?47\"\", \"\"b-12\"\", \"\"k:4\"\"]"'
    os.system(cmd)
    
    这种方式兼容性差、容易出错,不建议使用。

需求合理性分析

这个需求完全合理:很多场景下,修改已有脚本的成本很高(比如脚本是第三方维护、已有大量依赖该脚本的业务逻辑),临时通过外部调用方式解决参数传递问题是务实的选择。

但从长期维护和跨平台兼容性角度,同事建议的argparse或传递分隔字符串再拆分的方案更规范:

  • argparse可以直接定义列表类型的参数,自动处理解析逻辑,避免手动处理sys.argv的各种坑;
  • 传递分隔字符串(比如用|分隔元素,传递x?47|b-12|k:4)再在脚本内拆分,也能避免复杂字符串的shell解析问题,可读性和兼容性更好。

内容的提问来源于stack exchange,提问作者user6376297

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:02:36