在我的python文件中,我製作了一個GUI小部件,它接受用戶的一些輸入。我在我的python文件中導入了一個python模塊,它使用raw_input()進行一些輸入。我必須照原樣使用這個模塊,我無權改變它。當我運行我的python文件時,它向我詢問輸入(由於導入模塊的raw_input())。我想在那個地方使用GUI小部件輸入。 如何將導入模塊的用戶輸入(我們從小部件中獲取)作爲raw_input()傳遞給它?從python文件中輸入控制檯輸入
回答
首先,如果將import
直接放到腳本中實際上並不是一項要求(並且很難想象它爲什麼會這樣),那麼您可以將該模塊(或包裹它的簡單腳本)作爲單獨運行過程,使用subprocess
或pexpect
。
讓我們來具體說一下。假設你想用這個傻模塊foo.py
:
def bar():
x = raw_input("Gimme a string")
y = raw_input("Gimme another")
return 'Got two strings: {}, {}'.format(x, y)
先寫一個簡單的foo.wrapper.py
:
import foo
print(foo.bar())
現在,而不是直接在您的真實腳本中調用foo.do_thing()
,運行foo_wrapper
作爲一個子進程。
我假設你已經有了你想用字符串發送它的輸入,因爲這使得答案中不相關的部分變得更簡單(事實上,它使得它們成爲可能 - 如果你想使用一些對於這個GUI代碼,除非你首先告訴我們你正在使用哪個GUI庫,否則我實在無法告訴你該如何實現)。
所以:
foo_input = 'String 1\nString 2\n'
with subprocess.Popen([sys.executable, 'foo_wrapper.py'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE) as p:
foo_output, _ = p.communicate(foo_input)
當然,在現實生活中,你會想要使用foo_wrapper.py
,而不是假設它是在當前工作目錄中適當的路徑,但是這應該是足以說明這個想法。
同時,如果「我沒有權利去改變它」僅僅表示「我沒有(也不應該)已經籤權foo的項目的github網站或本公司的P4服務器上的相關子樹「或其他什麼,有一個非常簡單的答案:把它叉起來,然後換叉子。
即使它獲得了像LGPL這樣的弱版權左轉許可證:將它叉起來,更換叉子,在與原始相同的許可證下發布叉子,然後使用叉子。
如果您要依賴於每個目標系統上安裝的foo軟件包,而不能依賴替換的替換foo替換,那更有問題。但是,如果實際調用raw_input
的函數或方法只是foo
中實際代碼的一小部分,則可以通過在運行時對代碼foo
進行修改來解決該問題。
這導致了最後一搏的可能性:您可以隨時猴補丁raw_input
本身。
我再次假設你已經有了你需要的輸入來使事情變得簡單。
所以,首先你寫一個替代函數:
foo_input = ['String 1\n', 'String 2\n']
def fake_raw_input(prompt):
global foo_input
return foo_input.pop()
現在,有您可以修補此兩種方法通常情況下,要做到這一點:
import foo
foo.raw_input = fake_raw_input
這意味着任何在調用raw_input
的foo
中的代碼將會看到你填充到它的模塊全局變量中的函數,而不是正常的內建函數。除非它做了一些非常有趣的事情(例如直接查看內建函數並將其複製到局部變量或某物),這就是答案。
如果你需要處理的那些真正時髦的邊緣情況之一,你不介意做一些有問題的,你可以這樣做:
import __builtin__
__builtin__.raw_input = fake_raw_input
必須在第一import foo
任何地方之前做到這一點你問題。此外,目前還不清楚這是否有意保證工作,意外保證能夠正常工作(並且應該在未來進行修復),還是不能保證能夠正常工作。但它確實有效(至少對於CPython 2.5-2.7來說,這是你可能使用的)。
- 1. 從控制檯輸入java輸入
- 2. 從外部輸入文件自動控制臺輸入?
- 3. 從控制檯輸入流
- 4. 在控制檯中輸入輸入
- 5. C#:從控制檯輸出分離控制檯輸入
- 6. 控制檯輸入直到。並輸入
- 7. 如何在ipython控制檯中輸入python代碼文件?
- 8. 從java中將控制檯輸出寫入文本文件
- 9. Python無阻塞控制檯輸入
- 10. Python HTTPServer serve_forever控制檯輸入
- 11. Python不斷解析控制檯輸入
- 12. 在輸入框中輸入顯示文本到控制檯
- 13. 將Python標準輸入流更改爲Windows控制檯輸入
- 14. C#控制檯輸入
- 15. 控制檯忽略輸入
- 16. 輸入值在控制檯
- 17. QtCreator 2.4.1控制檯輸入
- 18. Apache-Camel控制檯輸入
- 19. 控制檯輸入掩碼
- 20. java控制檯輸入
- 21. 標準控制檯輸入
- 22. Python - 輸入控件
- 23. Java從控制檯輸入字符串輸入
- 24. 從C++的控制檯輸入一個大的輸入
- 25. 如何從控制檯輸入數字
- 26. 閱讀從控制檯輸入在OSX
- 27. 從控制檯讀取密碼輸入
- 28. Xcode 6.1控制檯輸入/輸出
- 29. Asm控制檯輸入/輸出
- 30. 捕捉控制檯輸入輸出
http://docs.python.org/2/library/subprocess.html – seth
我仍然不知道如何使用子進程。 – user2460869
@ user2460869:StackOverflow不是要求教程的好地方。如果你的問題只是「我知道我應該使用'subprocess',但有人必須教我如何使用它,」這對本網站來說不是一個恰當的問題。另一方面,如果你的評論是問:「子過程怎麼能幫助我?」,這是完全合理的。 – abarnert