我使用python2.7和glade3.15来创建一个GUI,允许单击按钮执行由我的工作团队维护的各种现有bash/cshell脚本。我对Python还比较陌生,但已经成功地建立并运行了基本的应用程序结构。但是,我调用的某些bash脚本将逐步执行多个用户提示并获取输入以确定结束行为。我遇到的问题是,当我将bash脚本作为python子进程调用时,bash脚本似乎一次又一次地接受空输入,从而导致提示无休止地循环。在
例如: bash脚本提示:
"Please enter your 4 digit document number:"
** accept user input in terminal **
"You entered ----, is that correct?
1.) Yes
2.) No "
当从python调用时,终端将按提示,发送一个空响应。由于bash脚本会循环,直到收到肯定的响应,结果是终端无休止地打印:
^{pr2}$关于这个问题,我已经在这里和其他地方广泛地试图找到答案,但是还没有找到/发展出一个解决方案。在
关于这个问题,我的基本python如下所示(尽管我尝试过各种不同的方法)
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事件调用一个子进程,该事件启动终端中的bash脚本,并等待键盘终端输入遍历提示,就像直接从终端运行一样。抱歉,这么久了-我想说得透彻和明确。提前谢谢你的帮助。在
******更新****
如果我用.wait()方法从另一个独立的python文件调用子进程,那么交互就可以正常工作了。但是,当我使用相同的参数和方法调用GUI button_click事件的子进程时,就会发生循环异常。我认为这与我的按钮点击事件和子进程的函数有关,但是我不知道如何在保持与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()
只需使用
os.system
:语法是
^{pr2}$os.system("executable option parameter")
。例如
好吧,如果有人感兴趣,为了实现我的目标,我只需将stdin和stdout单独处理,并将.wait()方法应用于子进程定义,但这只在从独立的python脚本调用时才起作用;当连接到GUI button click事件时,我无法保留功能。在
stdin和stdout可以保留为默认值,并且可以实现标准终端交互,只要子进程定义附加wait()方法。在
相关问题 更多 >
编程相关推荐