为了账号安全,请及时绑定邮箱和手机立即绑定

python subprocess run 适用于单个字符串但不适用于字符串列表

python subprocess run 适用于单个字符串但不适用于字符串列表

呼如林 2023-06-20 13:45:15
我正在尝试使用subprocess模块中的run方法从我的 Python 脚本中使用命令行选项启动命令行程序。我的命令被定义为指定程序和选项的字符串列表,如下所示(其中pheno_fp和construction_fp是代表我系统中文件路径的字符串,exe是代表我正在运行的程序的文件路径的字符串):    step1_cmd = [exe,                 "--step 1",                "--p " + pheno_fp,                "--b 1000",                "--o " + construction_fp + "dpw_leaveout"]不工作- 当我尝试以下操作时,我要运行的程序已启动,但我指定的命令被错误解释,因为程序退出并显示错误“使用 --o 标志指定输出文件路径”:    test1 = subprocess.run(step1_cmd)工作- 当我尝试以下操作时,程序正确执行,这意味着所有参数都按预期解释:    test1 = subprocess.run(" ".join(step1_cmd), shell=True)如果我正确理解了文档,前一种方法是推荐的用法,但我不明白为什么它不起作用。我很确定它的格式与文档中的示例相同,所以我有点难过。有任何想法吗?
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

将每个参数与其值分开,如下所示:


step1_cmd = [exe, 

             "--step",

             "1",

             "--p",

             str(pheno_fp),  # if it isn't a string already

             "--b",

             "1000",

             "--o",

             str(construction_fp) + "dpw_leaveout"

]

因为在传递参数列表时,每个部分都用空格分隔,包括选项和它们的值


查看完整回答
反对 回复 2023-06-20
?
三国纷争

TA贡献1804条经验 获得超7个赞

此行为的解释在这里:

args 是所有调用所必需的,并且应该是一个字符串或一系列程序参数。通常首选提供一系列参数,因为它允许模块处理任何需要的参数转义和引用(例如,允许文件名中有空格)。

示例:序列

l = ['ls', '-l tmp']

给出错误

subprocess.run(l)                                                                                                                                                      
ls: illegal option --

这是因为subprocess(这是对 的调用Popen)正在尝试运行ls "-l tmp"

定义参数序列的正确方法是将它们分开,以便正确引用它们

subprocess.run(['ls', '-l', 'tmp'])



查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信