2011-11-28 35 views
1

我剛學到了subprocess.check_call()函數。我打算用它來代替我的os.system命令。python子進程「mount」不會提示輸入密碼

本來,我有我的命令,例如:

os.system("mount -t cifs //source/share /mnt/share -o username=user") 

上面的命令會提示輸入密碼,如果密碼正確,將安裝驅動器。

不過,如果我嘗試:

cmd_string="mount -t cifs //source/share /mnt/share -o username=user" 

subprocess.check_call(cmd_string.split(" "), shell=True, stdin=sys.stdin) 

它不會詢問密碼。相反,它只是打印分區。這就像調用沒有參數的「mount」命令。

任何想法如何使用check_call並仍然接收來自用戶的交互式輸入?

+0

也許這個鏈接http://stackoverflow.com/questions/421206/in-python-how-i-do-use-subprocess-instead-of-os-system將幫助你.. – Manie

+0

順便說一下,它是'check_call ',而不是'call_check';現在編輯。 –

+0

嗯,感謝您更新錯字:P – Patrick

回答

4

調用mount沒有參數。如果指定shell=True,則subprocess需要包含參數的整個命令作爲一個大字符串傳遞給shell。如果您指定shell=False(如果未指定,則爲缺省值),命令及其參數將作爲字符串列表傳遞,如使用split所做的那樣。通過混合這兩種形式,您實際上只傳遞字符串mount作爲要執行的命令。刪除shell=True或刪除.split(" ")。第一種選擇通常更好,除非有某些原因需要涉及shell解析,通常需要避免。

+0

謝謝!這看起來像我的問題。刪除shell = True後,系統提示輸入密碼。然而,我的屏幕搞亂了,我無法正確輸入密碼......我不得不使用「重置」命令來重置我的終端窗口。任何想法? – Patrick

+0

沒關係,我正在使用Popen來測試它。在切換回call_check()後,它按預期工作! – Patrick

+0

如果你想要,你可以使用python的getpass模塊('from getpass import getpass'; pwd = getpass())將一個「安全」(無回聲)密碼直接輸入到你的程序中。 – jsbueno