48 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import subprocess
 | |
| import sys
 | |
| import PySimpleGUI as sg
 | |
| 
 | |
| """
 | |
| 	Demo Program - Realtime output of a shell command in the window
 | |
| 		Shows how you can run a long-running subprocess and have the output
 | |
| 		be displayed in realtime in the window.
 | |
| """
 | |
| 
 | |
| def main():
 | |
| 	layout = [  [sg.Text('Enter the command you wish to run')],
 | |
| 				[sg.Input(key='-IN-')],
 | |
| 				[sg.Output(size=(60,15))],
 | |
| 				[sg.Button('Run'), sg.Button('Exit')] ]
 | |
| 
 | |
| 	window = sg.Window('Realtime Shell Command Output', layout)
 | |
| 
 | |
| 	while True:             # Event Loop
 | |
| 		event, values = window.read()
 | |
| 		# print(event, values)
 | |
| 		if event in (None, 'Exit'):
 | |
| 			break
 | |
| 		elif event == 'Run':
 | |
| 			runCommand(cmd=values['-IN-'], window=window)
 | |
| 	window.close()
 | |
| 
 | |
| 
 | |
| def runCommand(cmd, timeout=None, window=None):
 | |
| 	""" run shell command
 | |
| 	@param cmd: command to execute
 | |
| 	@param timeout: timeout for command execution
 | |
| 	@param window: the PySimpleGUI window that the output is going to (needed to do refresh on)
 | |
| 	@return: (return code from command, command output)
 | |
| 	"""
 | |
| 	p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
 | |
| 	output = ''
 | |
| 	for line in p.stdout:
 | |
| 		line = line.decode(errors='replace' if (sys.version_info) < (3, 5) else 'backslashreplace').rstrip()
 | |
| 		output += line
 | |
| 		print(line)
 | |
| 		window.refresh() if window else None        # yes, a 1-line if, so shoot me
 | |
| 
 | |
| 	retval = p.wait(timeout)
 | |
| 	return (retval, output)
 | |
| 
 | |
| 
 | |
| main()
 |