我正在尝试获取文件名并将其传递给使用 popen 的命令。然后我想打印输出。这是我的代码:
filePath = tkinter.filedialog.askopenfilename(filetypes=[("All files", "*.*")])
fileNameStringForm = (basename(filePath ))
fileNameByteForm = fileNameStringForm.encode(encoding='utf-8')
process = subprocess.Popen(['gagner','-arg1'], shell = True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process .communicate(fileNameByteForm )
stdout, stderr = process .communicate() <<------ERROR POINTS TO THIS LINE
stringOutput = stdout.decode('urf-8')
print(stringOutput)
我收到以下错误:
ValueError: Invalid file object: <_io.BufferedReader name=9>
我看过其他类似的问题,但似乎没有什么能解决我的问题。有些人可以告诉我代码中哪里出错了吗?
编辑:如果我要在命令行中运行该命令,它将是:
gagner -arg1 < file1
你正在做的事情不是你在假定的命令行参数中描述的。您实际上是在执行以下命令:
echo "file1" | gagner -arg1
您需要确保自己传入文件内容。Popen 不会为您打开和读取文件。
根据文档,communicate()
所做的是
与进程交互:将数据发送到标准定。从标准输出和标准输出读取数据,直到到达文件末尾。等待进程终止。
所以,一旦你跑了
process.communicate(fileNameByteForm)
子流程已完成,管道已关闭。然后,第二个调用将因此失败。
相反,您要做的是
stdout, stderr = process.communicate(input_data)
这会将您的输入数据通过管道传输到子进程中并读取 stdout 和 stderr。