2016-12-13 77 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