我使用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()
'=标准输入子过程。PIPE'意味着子过程应该从管道输入,而不是从终端输入。 – Barmar
你已经用'stdin = Subprocess.PIPE'配置了你的'Popen'调用。这将不允许接受任何输入。 –
谢谢。这是有道理的,我感谢你澄清。你能解释一下我应该设置stdin来接收终端输入吗?我试过stdin = None,这不起作用,也没有定义stdin。谢谢 –