2017-07-28 81 views
0

我有一個接受來自用戶的輸入的python 3腳本,這個輸入是通過管道輸入到一個已經衍生出shell的子進程中。最初我打算將這些代碼與一個套接字放在一起,以便能夠製作我自己的非嚴肅的遠程管理工具,但是這對我目前的級別來說太難了。代碼:如何在不通信的情況下讀取python子進程標準輸出

import subprocess 

p1 = subprocess.Popen(["/bin/sh"], stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf-8") 

command = input("Command: ") 

p1.stdin.write(command) 

p1.stdout.read() 

問題:沒有被打印出來。我搜索了無盡的時間 在線有一個原因,多天,但他們似乎並沒有 工作,和/或建議使用溝通()這是我不想 想做的事情。如果我可以通過 套接字實現此功能,那麼在進行思考時,我不能在每個命令之後關閉該進程。我還有 也試過了,到處寫之前,在讀之間,在 之後寫,幾乎到處都可以想到。它應該是簡單的 就足夠了,而不需要深入研究io模塊或緩衝規則(現在太遲了) 。我一直在爲此掙扎幾天 。

+0

歡迎來到Stack Overflow!當您發佈代碼塊時,請在每行的開頭添加四個空格,以使其顯示爲代碼段。有關格式化帖子的更多信息,請閱讀幫助中心的[編輯幫助](// stackoverflow.com/editing-help)。 –

回答

0

你有幾個問題,我會盡量畫出路徑,我希望我不會誤導你。

首先,免責聲明:執行用戶輸入本質上是不安全的。如果這不是問題,讓我們繼續解決你的問題。

我會做

p1 = subprocess.Popen(["/bin/sh"], stderr=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, bufsize=1) 

有一個行緩衝PIPE是一個好主意,在這種情況下啓動。

然後,請記住,你必須按命令後回車,這樣:

command = input("Command: ") + "\n" 

寫是正確的,

p1.stdin.write(command) 

但是,讀是非常危險的,你會平凡陷入僵局。因爲stdout是開放的(沒有EOF或類似的東西),你應該保守地閱讀,而且你仍然會遇到問題。

第一個想法是將讀線:

p1.stdout.readline() 

但是,如果你不知道你能有多少行讀......那麼這是一個問題。其實那個具體問題has already been asked

如果您想實驗,只需打開一個交互式Python解釋器,發送"ls\n"命令並執行readline()。它會起作用,直到你讀完最後一行,然後......它將永遠等待。那是不好的行爲。所以你需要解決這個問題。

相關問題