我正在尝试获取文件名并使用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
答案 0 :(得分:2)
您正在做的不是您在假定的命令行参数中描述的内容。你实际上是在执行这个:
echo "file1" | gagner -arg1
您需要确保自己传递文件内容。 Popen不会为您打开并阅读该文件。
根据documentation,communicate()
做的是
与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。
所以,一旦你运行了
process.communicate(fileNameByteForm)
您的子流程已完成且管道已关闭。结果,第二次调用将失败。
你要做的是
stdout, stderr = process.communicate(input_data)
将输入数据传输到子进程并读取stdout和stderr。