2017-10-04 76 views
1

我有一個關於pythonw的問題。我正在製作一個應該在後臺執行的程序。當它啓動時,它應該發送計算機名,用戶名和檢查結果以查看該程序是否具有管理權限。以下是有關部分客戶端代碼:Python pythonw子進程check_output不工作

computername = subprocess.check_output("echo %computername%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 
username = subprocess.check_output("echo %username%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 
isadmin = ctypes.windll.shell32.IsUserAnAdmin() 
sleep(0.5) 
s.send(computername.encode() + ";;".encode() + username.encode() + ";;".encode() + str(isadmin).encode()) 

這是一塊服務器代碼,是應該接受它:

data = conn.recv(1024).decode().split(";;") 
print(data) 
clientcount += 1 
clientlist.append({"conn": conn, "ip": ip, "id": clientcount, "name": data[0] + "\\" + data[1], "isadmin": int(data[2])}) 

(打印行只是爲了調試) 所以這裏的問題。當我執行客戶端代碼爲client.py,一切都正常工作,我得到這樣的輸出:

['DESKTOP-#######', '######', '0']

和代碼可以繼續。但是,當我執行程序爲client.pyw,因爲它應該是,我得到:

['']

所以當然我得到一個IndexError。我猜測subprocess.check_output出了問題。這是正常的嗎?我可以用什麼來替換它,所以它在後臺工作?

(我使用python 3.5)

感謝

回答

1

.pyw沒有一個控制檯,所以無stdin重定向運行pythonw時(如重複的解釋有一個問題與subprocess我剛剛挖出來)。

在您的情況下,通過爲輸入&錯誤提供有效的流來解決問題,即可添加stdin=subprocess.PIPE,stderr=subprocess.STDOUT

但是,最重要:

subprocess.check_output("echo %computername%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 

真的矯枉過正

os.getenv("computername") 

,這將與pythonw工作,以便做到這一點,它的清潔劑,它肯定會解決你的問題。

+0

Je suppose que tu estfrançaisvu ton nom,çatombe bien,moi aussi ^^。 Haha,quel idiot,j'avaiscomplètementoubliéos.getenv ==「。Je vaisutiliserça,mais sinon,j'airésolumonproblème。C'étaita cause du sys.stdout.encoding,vu que c'est en arrière計劃這不是一個傳統的標準^^「。 Sansçaçamarche,mais je vais quandmêmeutiliser os.getenv(),加上乾淨。留言Merci! – Alpha

+0

oui,c'est mieux!是的,它更好。 –

相關問題