python - 调用 bash 脚本作为 Python 子进程 - Bash 陷入无限循环,输入错误

标签 python linux bash python-2.7 shell

我使用 Python 2.7 和 Glade 3.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 脚本会循环直到收到肯定响应,因此结果是终端无休止地打印:

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

我已经在此处和其他地方广泛尝试寻找有关此问题的答案,但尚未找到/开发解决方案。

相对于这个问题,我的基本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 事件的子进程时,就会发生循环异常。我认为这与我的按钮单击事件和在 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()

最佳答案

只需使用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("可执行选项参数")
例如,

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

关于python - 调用 bash 脚本作为 Python 子进程 - Bash 陷入无限循环,输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41130189/

相关文章:

bash - 来自守护进程 : OCI runtime create failed: container_linux. go:349 的错误响应:启动容器进程导致 "exec:\"/bin/bash\"

python - 使用 Python 计算精确分数

javascript - 在expressJS应用程序中,是否可以在脚本执行时实时收集写入控制台的数据?

python - 我如何将 SMOTE 应用于多类文本数据

windows - mxmlc 在 linux 和 windows 下编译不同?

c++ - 将 armadillo 库添加到 linux 中的 g++ 编译器

javascript - 如何从服务本身安装 Linux 服务?

bash - grep 数字范围

python - 在 Python 中以编程方式生成视频或动画 GIF?

Python:使用 map 函数独立处理每一行