调用bash脚本作为Python子进程bash陷入无休止的循环,导致inpu变差

2024-04-25 08:48:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()

Tags: fromimportself脚本bash终端getobject
2条回答

只需使用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")
例如

^{pr2}$

好吧,如果有人感兴趣,为了实现我的目标,我只需将stdin和stdout单独处理,并将.wait()方法应用于子进程定义,但这只在从独立的python脚本调用时才起作用;当连接到GUI button click事件时,我无法保留功能。在

 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可以保留为默认值,并且可以实现标准终端交互,只要子进程定义附加wait()方法。在

相关问题 更多 >