1

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

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 进程资源管理器中打开的进程,它会显示一次传递的所有参数

4

1 回答 1

0

这里发生了很多事情。您描述的行为的底线myapp.exe显然是通过 接收和处理输入stdin,但是通过这种更改,您不仅切换到使用变量,而且还停止通过它们传递它们,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))

或(与上面类似,使用writestdin创建的类似文件的对象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))

但是,这是我想提到的另一件事,这不是最初的示例所做的。这些值通过空格(而不是换行符)分隔。所以它工作,接收myapp.exe可能实际上期望空格而不是换行符(或任何空白字符,在这种情况下两者都可以)。

于 2018-02-24T13:52:00.573 回答