我使用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()
'=標準輸入子過程。PIPE'意味着子過程應該從管道輸入,而不是從終端輸入。 – Barmar
你已經用'stdin = Subprocess.PIPE'配置了你的'Popen'調用。這將不允許接受任何輸入。 –
謝謝。這是有道理的,我感謝你澄清。你能解釋一下我應該設置stdin來接收終端輸入嗎?我試過stdin = None,這不起作用,也沒有定義stdin。謝謝 –