不知道如何修复popen,"无效的文件对象"错误

时间:2016-03-19 00:01:57

标签: python-3.x tkinter

我正在尝试获取文件名并使用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

1 个答案:

答案 0 :(得分:2)

您正在做的不是您在假定的命令行参数中描述的内容。你实际上是在执行这个:

echo "file1" | gagner -arg1

您需要确保自己传递文件内容。 Popen不会为您打开并阅读该文件。

根据documentationcommunicate()做的是

  

与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。

所以,一旦你运行了

process.communicate(fileNameByteForm)

您的子流程已完成且管道已关闭。结果,第二次调用将失败。

你要做的是

stdout, stderr = process.communicate(input_data)

将输入数据传输到子进程并读取stdout和stderr。