2013-11-15 19 views
4

我一直在嘗試編寫一些「遊戲」來幫助其他人學習python,但是我在跳出頭腦風暴階段之後就碰到了一堵牆。 請參閱,它涉及使腳本打開另一個腳本,然後向其中插入輸入。例如:如何在python中打開一個文件並向其中插入一個或多個輸入?

username = raw_input('Insert username:') 
password = raw_input('Insert password:') 
if username == user: 
    if password == 1234: 
    print('Congratulations, you cracked it!') 

這將是我的源代碼。然後我會有另一個代碼,在這個代碼中,我會寫一些東西來打開前面的腳本,插入「user」就好像我自己在命令提示符中鍵入的那樣,然後嘗試插入0到0之間的每個數字, ,10000.因此,類似於:

for n in range(0, 10000) 
    [Insert script to open file] 
    [input 'user'] 
    [input n] 

我該如何繼續編碼最後一部分?

+0

你有僞代碼。只需將其逐行轉換爲python即可。它是如此簡單。提示:'file_handler = open(file,「w +」)'then'file_handler.write(something)' – karthikr

+0

@karthikr:他試圖運行一個腳本併爲它提供輸入,而不是創建一個文件並寫入它。我知道這是混亂的標題,但讀了第二段。 – abarnert

+0

啊..我明白了。謝謝 – karthikr

回答

6

subprocess模塊可讓您運行其他程序(包括腳本)並控制其輸入和輸出。例如:

import subprocess, sys 
p = subprocess.Popen([sys.executable, 'thescript.py'], stdin=subprocess.PIPE) 
p.stdin.write('user\n') 
p.stdin.write('{}\n'.format(n)) 
p.wait() 

如果你可以一次建立所有的輸入並把它傳遞一個字符串,你可以使用communicate

如果您還想捕獲其輸出,請爲stdout添加另一個PIPE

import subprocess 
p = subprocess.Popen(['python', 'thescript.py'], 
        stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
out, err = p.communicate('user\n{}\n'.format(n)) 

有關如何工作的詳細信息,請閱讀文檔;這一切都解釋得很好。 (然而,完全不是有組織的;您可能想要閱讀開篇部分,然後跳到「替換舊功能」,然後閱讀「常用參數」,然後返回到頂部並按順序進行。 )

如果您需要以比「發送所有輸入,然後獲取所有輸出」更復雜的方式與它進行交互,這很難做到正確,因此您應該查看第三方pexpect模塊。

1

這是你想要的嗎?

import subprocess 

for n in range(0, 10000): 
     p = subprocess.Popen("python another_script.py", shell=True, 
        stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
     p.stdin.write("user\n" + str(n) + "\n") 
     out = p.stdout.read() 
     if "cracked" in out: 
       print "cracked: " + str(n) 
       break 
+0

泄漏'Popen'對象不是一個好主意;你應該總是「等待」它。 (或者做一些等同的事情,比如使用'communic',它將把'write','read'和'wait'放在一起。) – abarnert

1

好的,我做到了。感謝幫助的人,但我使用模塊解決。 我做我自己的小模塊,像這樣:

文件名:PASS1

def insertpassword(username, password): 
    if username == 'user': 
    if password == '12345': 
     print('You did it!') 

那我該做的是:

import pass1 
pass1.insertpassword(raw_input('Insert username:'),raw_input('Insert password:')) 

至於開裂:

import pass1 
for n in range(0, 100000): 
    pass1.insertpassword('user', str(n)) 

謝謝無論如何,每個人。

相關問題