如何通过subprocess.communicate将字符串变量列表传递给stdout

时间:2018-02-17 00:31:53

标签: python variables subprocess shlex

我可以成功硬编码我的值,如下所示: (我的应用程序启动并传递参数,它就像我在手动输入每个参数后按Enter键一样运行,如果我通过命令行运行它,手动输入参数并在每个参数后按Enter键):

from subprocess import Popen, PIPE, STDOUT
p = Popen(['C:\\Program Files\\app\\Bin\\current\\myapp.exe'], stdout=PIPE, 
stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='13 20180212.log 20180212.txt 
20180212fix.txt'.encode("utf-8"))[0]
stdout = p.communicate()[0]
print ("STDOUT:{}".format(stdout))`

但是我想用变量替换这些硬编码值,并且它不能成功运行如下:

输出打印如下 - 应用程序打开但没有发生任何事情

C:\ Program Files \ app \ Bin \ current \ myapp.exe [' 13',' 20180212.log',' 20180212.txt',' 20180212fix.txt']

option_num = "13"
date_log = "20180212.log"
date_text = "20180212.text"
date_fix = "20180212.fix"

arguments = [option_num, date_log, date_text, date_fix]
print (arguments)

command = [program_name]
command.extend(arguments)

output = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
print (output)

没有错误,应用程序只将其作为一行输入接收,而不是处理返回或在每个变量后输入 - 如果我查看在Windows Process Explorer中打开的进程,它会显示一次传递的所有参数

1 个答案:

答案 0 :(得分:0)

这里有很多事情发生。您描述的行为的底线是myapp.exe显然通过stdin接收和处理输入,但是通过该更改,您不仅切换到使用变量,而且还停止通过{{传递它们1}}而是使用这些值作为位置参数调用您的应用程序。

如果您确实想要在新行上传递每个值,您可以执行类似的操作(取决于您希望如何处理分组以及您希望从代码中获得什么)。代码的变化:

stdin

或(使用基于values = (option_num, date_log, date_text, date_fix) input_data = '\n'.join(values) stdout_data = p.communicate(input=input_data.encode('utf-8'))[0] print("STDOUT:{}".format(stdout_data)) 生成器的writelines方法:

values

或(与上文类似,使用为values = (option_num, date_log, date_text, date_fix) p.stdin.writelines(((v+'\n').encode('utf-8') for v in values)) stdout_data = p.communicate()[0] print("STDOUT:{}".format(stdout_data)) 创建的write类文件对象的stdin

PIPE

但是,这是我想提及的另一件事,这不是最初的例子所做的。这些值是以空格(而不是换行符)分隔的。所以它有效,接收values = (option_num, date_log, date_text, date_fix) for v in values: input_line = (v+'\n').encode('utf-8') # append newline and convert to bytes p.stdin.write(input_line) stdout_data = p.communicate()[0] print("STDOUT:{}".format(stdout_data)) 实际上可能期望空格而不是换行符(或任何空白字符,在这种情况下两者都可以)。