2013-07-16 58 views
0

在我的python文件中,我製作了一個GUI小部件,它接受用戶的一些輸入。我在我的python文件中導入了一個python模塊,它使用raw_input()進行一些輸入。我必須照原樣使用這個模塊,我無權改變它。當我運行我的python文件時,它向我詢問輸入(由於導入模塊的raw_input())。我想在那個地方使用GUI小部件輸入。 如何將導入模塊的用戶輸入(我們從小部件中獲取)作爲raw_input()傳遞給它?從python文件中輸入控制檯輸入

+1

http://docs.python.org/2/library/subprocess.html – seth

+0

我仍然不知道如何使用子進程。 – user2460869

+0

@ user2460869:StackOverflow不是要求教程的好地方。如果你的問題只是「我知道我應該使用'subprocess',但有人必須教我如何使用它,」這對本網站來說不是一個恰當的問題。另一方面,如果你的評論是問:「子過程怎麼能幫助我?」,這是完全合理的。 – abarnert

回答

1

首先,如果將import直接放到腳本中實際上並不是一項要求(並且很難想象它爲什麼會這樣),那麼您可以將該模塊(或包裹它的簡單腳本)作爲單獨運行過程,使用subprocesspexpect

讓我們來具體說一下。假設你想用這個傻模塊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_inputfoo中的代碼將會看到你填充到它的模塊全局變量中的函數,而不是正常的內建函數。除非它做了一些非常有趣的事情(例如直接查看內建函數並將其複製到局部變量或某物),這就是答案。

如果你需要處理的那些真正時髦的邊緣情況之一,你不介意做一些有問題的,你可以這樣做:

import __builtin__ 
__builtin__.raw_input = fake_raw_input 

必須在第一import foo任何地方之前做到這一點你問題。此外,目前還不清楚這是否有意保證工作,意外保證能夠正常工作(並且應該在未來進行修復),還是不能保證能夠正常工作。但它確實有效(至少對於CPython 2.5-2.7來說,這是你可能使用的)。