[英]Dont know how to fix popen ,“Invalid file object” error
我正在嘗試獲取文件名,並使用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()
作用是
與流程交互:將數據發送到stdin。 從stdout和stderr讀取數據,直到到達文件末尾。 等待進程終止。
所以,一旦你跑了
process.communicate(fileNameByteForm)
您的子流程已完成,管道已關閉。 結果,第二個呼叫將失敗。
您要做的是
stdout, stderr = process.communicate(input_data)
這會將您的輸入數據通過管道傳輸到子進程中,並讀取stdout和stderr。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.