2014-05-19 84 views
0

我有一個小程序(程序A)要求輸入密碼,如果密碼正確,它會打開一個shell。我想在python中創建另一個程序(程序B),它調用程序A並給出密碼作爲輸入,以便打開shell。使用子進程的Python利用

我正在做以下工作,但程序只是終止,不讓我使用shell。

p = subprocess.Popen("./ProgramA", stdin=subprocess.PIPE) 
p.communicate("password") 

當運行程序B我的終端是這樣的:

~/Desktop/$./ProgramB 
Password: Here is your shell. 
~/Desktop/$ (this is not the shell opened by program A) 

我該如何解決這個問題?

回答

0

shell從其父進程啓動ProgramA inehrits stdin,因此它繼承了管道。此時管道已經關閉,所以殼體退出。

你會想把終端保留爲stdin,但是這樣很難僞造密碼輸入。

0

Popen.communicate()關閉子進程的stdin並等到它終止 - 這是預期的行爲。你需要的僅僅是p.stdin.write("password")

+0

這也不會使它工作,因爲用戶無法提供任何交互式輸入到shell。您需要添加將'ProgramB'的標準輸入轉發給'ProgramA'的任何輸入的代碼。 –

0

假設這是linux或osx,如果stdin是一個管道而不是終端,並且他們還「四處走動」並讀取終端的密碼,程序通常會以不同的方式運行。在你的情況下,該程序可能沒有看到終端並退出。嘗試使用python pexpect模塊或閱讀其源代碼以瞭解如何爲標準輸入打開一個pty。