不知道如何修复popen,"Invalid file object"错误



我正在尝试获取文件名并将其传递给使用 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。

最新更新