从Python发送任意数量输入到.exe文件

2 投票
4 回答
669 浏览
提问于 2025-04-15 14:14

p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     strpoints, stdout = subprocess.PIPE)

在上面的代码中,input1、input2 和 input3 都是整数,它们会被转换成字符串。变量 "strpoints" 是一个长度不固定的字符串列表。input1 告诉 myprog 这个 strpoints 的长度。当然,当我尝试运行上面的代码时,我得到了以下错误信息:

类型错误:无法隐式将 'list' 对象转换为 str

我该如何将 strpoints 中的所有元素传递给 myprog.exe?难道我就只能先用 str(strpoints) 转换,然后让 myprog.exe 解析这个字符串中的逗号、引号等吗?例如:

`>>> x = ['a', 'b']

`>>> str(x)

"['a', 'b']"

还是说我应该提前创建一个很大的字符串?例如:

'>>> x = ['a', 'b']

'>>> stringify(x)

' a b'

这里的 stringify 可能是类似于


def stringify(strlist):
    rlist = ""
    for i in strlist:
        rlist = rlist + i + " "
    return rlist
的东西。

4 个回答

1

不要把所有的参数都拼接成一个字符串来使用。

直接传递一个参数的序列(比如列表或元组)会简单得多,也更好更安全。特别是当某个参数里包含空格时(这在文件名中很常见),这样做就更重要了。

7

args可以是一个序列:

p = subprocess.Popen(args = ["myprog.exe"] + 
                            [str(x) for x in [input1,input2,input3]] + 
                            strpoints,stdout = subprocess.PIPE)

如果你的参数中包含一些特殊字符,比如'*',而你又不想让它们被当作特殊字符处理,这样写会更正确。

4

试试用 string.join 方法:

p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     " ".join(strpoints), stdout = subprocess.PIPE)

撰写回答