2016-12-13 25 views
-1

我使用Python 2.7與Glade 3.15創建一個GUI,允許單擊按鈕執行由我的工作維護的各種現有bash/cshell腳本球隊。我對Python相當陌生,但已經成功地實現了基本的應用程序結構。但是,我打電話的某些bash腳本將逐步通過多個用戶提示並採取輸入來確定最終行爲。我遇到的問題是當我將一個bash腳本作爲python子進程調用時,bash腳本看起來像是一次空的輸入,從而導致提示無休止地循環。作爲Python子進程調用bash腳本 - Bash陷入無限循環變得不好輸入

例如: 甲bash腳本,提示:

"Please enter your 4 digit document number:" 
    ** accept user input in terminal ** 
"You entered ----, is that correct? 
     1.) Yes 
     2.) No " 

當從蟒調用時,終端將通過提示按下,發送空響應。由於bash腳本循環,直到接收到肯定響應,結果是終端不休打印:

"You entered ----, is that correct? 
     1.) Yes 
     2.) No " 

我已經廣泛地試圖找到答案,在這裏和其他地方,對這個問題,但還沒有找到/開發出解決方案呢。

我的基本蟒,相對於這個問題,如下(雖然我已經嘗試了多種不同的方法)

import subprocess 
from subprocess import Popen,PIPE 
... 
# Definition for subprocess calls 
    def subprocess_cmd(self, command): 
    process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    process.wait() 
    (output, err) = process.communicate() 
    print output 
... 

# Script-Call Button 
    def on_btnScript_clicked(self, object, data=None): 
    self.subprocess_cmd("scriptname_is_here") 

我只是想從我的Python button_click事件調用子是kicks-關閉終端中的bash腳本,並等待鍵盤終端輸入來逐步顯示提示,就像直接從終端運行一樣。抱歉這麼久 - 想要徹底和明確。預先感謝您的幫助。

***** **** UPDATE

如果我請從與.wait()方法中的另一獨立Python文件子進程,如所期望的交互工作。但是,當我通過GUI button_click事件調用子進程時,使用相同的參數和方法,會發生循環異常。我認爲這與我的mainDialog類中定義的按鈕單擊事件和subprocess_cmd'function'有關,但我不知道如何在保留與GUI的連接的同時將它們分開。

這裏是我的代碼更多的上下文

#!/usr/bin/python 

# Library Imports 
from gi.repository import Gtk 
from os import system 
import subprocess 
from subprocess import Popen,PIPE 
import time 
try: 
    import math 
except: 
    print "Math Library Missing" 
    sys.exit(1) 

class mainDialog: 

# Build the 'form load' parameters 
    def __init__(self): 
    self.gladefile = "test.glade" 
    self.builder = Gtk.Builder() 
    self.builder.add_from_file(self.gladefile) 
    self.builder.connect_signals(self) 
    self.winMain = self.builder.get_object("winMain") 
    self.winCptArg = self.builder.get_object("winCptArg") 
    self.winMsbHelp = self.builder.get_object("winMsbHelp") 
    self.winCptHelp = self.builder.get_object("winCptHelp") 
    self.winAiHelp = self.builder.get_object("winAiHelp") 
    self.winMain.move(2625, 400) 
    self.winMain.show() 

# Definition for subprocess calls 
    def subprocess_cmd(self, command): 
    process = subprocess.Popen(command) 
    process.wait() 
... 

# Script-Call Button 
    def on_btnScript_clicked(self, object, data=None): 
    self.subprocess_cmd("scriptname_is_here") 

if __name__ == "__main__": 
    main = mainDialog() 
    Gtk.main() 
+0

'=標準輸入子過程。PIPE'意味着子過程應該從管道輸入,而不是從終端輸入。 – Barmar

+0

你已經用'stdin = Subprocess.PIPE'配置了你的'Popen'調用。這將不允許接受任何輸入。 –

+0

謝謝。這是有道理的,我感謝你澄清。你能解釋一下我應該設置stdin來接收終端輸入嗎?我試過stdin = None,這不起作用,也沒有定義stdin。謝謝 –

回答

0

嗯,如果有人有興趣,達到了我的意圖,我只是離開stdin和stdout獨自一人,並應用了.wait()方法將子進程定義 - 但這隻適用於從獨立的python腳本調用;連接到GUI按鈕單擊事件時,我無法保留功能。

def subprocess_cmd(self, command): 
    process = subprocess.Popen(command).wait() 
... 

def on_btnScript_clicked(self, object, data=None): 
    self.subprocess_cmd("filepath/scriptname_is_here") 

stdin和stdout可以保留爲默認值,並且可以實現標準的終端的交互,只要子流程定義被附加與等待()方法。

1

只需使用os.system

from os import system 
... 
# Definition for subprocess calls 
def subprocess_cmd(self, command): 
    process = system(str(command)) 
... 
# Script-Call Button 
def on_btnScript_clicked(self, object, data=None): 
    self.os.system("echo scriptname_is_here") 

語法os.system("executable option parameter")
例如,

os.system("ls -al /home") 
+0

感謝您的迴應。這似乎實現了我正在尋找的基本功能,但我無法弄清楚如何通過此調用傳遞參數 - 任何建議? –

+1

我添加了你問的語法 – rrao