我使用 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/