漏洞
Windows 7的
3.5
4.4.1
Python编程经验
1
总体编程经验
7
以前使用过另一个 Python GUI 框架(tkiner、Qt 等)(是/否很好)?
是的
我是 PySimpleGUI 的新手。 当我使用模块子进程并将 py 打包成 exe 时,它总是像下面的截图一样崩溃。 但是当我直接在cmd中运行我的py文件时,就很好了。 所以有人请告诉我如何解决它? 谢谢。
SimpleDemoTestSubprocess.py:
import PySimpleGUI as sg
import subprocess
def runCommand(cmd, timeout=None):
""" run shell command
<strong i="38">@param</strong> cmd: command to execute
<strong i="39">@param</strong> timeout: timeout for command execution
<strong i="40">@return</strong>: (return code from command, command output)
"""
prt('runCommand, cmd = ' + str(cmd))
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
prt('runCommand, communicate')
out, err = p.communicate()
prt('runCommand, wait')
p.wait(timeout)
prt(out)
prt(err)
return (out, err)
def prt(self, *args, sep=' ', end='\n', file=None):
print()
print(self, *args, sep=' ', end='\r\n', file=None)
# All the stuff inside your window.
layout = [
[sg.Text('Some text on Row 1')]
, [sg.Text('Enter something on Row 2'), sg.InputText()]
, [sg.Button('Ok'), sg.Button('Cancel')]
# , [sg.PopupScrolled('Hello From PySimpleGUI!', 'This is the shortest GUI program ever!')]
]
# Create the Window
window = sg.Window('Window Title', layout)
# Event Loop to process "events" and get the "values" of the inputs
while True:
event, values = window.read()
if event in (None, 'Cancel'): # if user closes window or clicks cancel
break
if event in (None, 'Ok'): # if user closes window or clicks cancel
runCommand("ls")
print('You entered ', values[0])
window.close()
将py打包成exe:
# https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_EXE_Maker.py
import PySimpleGUI as sg
import subprocess
from shutil import copyfile
import shutil
import os
def prt(self, *args, sep=' ', end='\n', file=None):
print()
print(self, *args, sep=' ', end='\r\n', file=None)
def Launcher():
sg.ChangeLookAndFeel('LightGreen')
layout = [[sg.T('PyInstaller EXE Creator', font='Any 15')],
[sg.T('Source Python File'), sg.In(key='_sourcefile_', size=(45, 1)),
sg.FileBrowse(file_types=(("Python Files", "*.py"),))],
[sg.T('Icon File'), sg.In(key='_iconfile_', size=(45, 1)),
sg.FileBrowse(file_types=(("Icon Files", "*.ico"),))],
[sg.Frame('Output', font='Any 15', layout=[[sg.Output(size=(65, 15), font='Courier 10')]])],
[sg.ReadFormButton('Make EXE', bind_return_key=True),
sg.SimpleButton('Quit', button_color=('white', 'firebrick3')), ]]
window = sg.Window('PySimpleGUI EXE Maker',
auto_size_text=False,
auto_size_buttons=False,
default_element_size=(20, 1,),
text_justification='right')
window.Layout(layout)
# ---===--- Loop taking in user input --- #
while True:
(button, values) = window.Read()
if button in ('Quit', None):
break # exit button clicked
source_file = values['_sourcefile_']
icon_file = values['_iconfile_']
icon_option = '-i "{}"'.format(icon_file) if icon_file else ''
source_path, source_filename = os.path.split(source_file)
workpath_option = '--workpath "{}"'.format(source_path)
dispath_option = '--distpath "{}"'.format(source_path)
specpath_option = '--specpath "{}"'.format(source_path)
folder_to_remove = os.path.join(source_path, source_filename[:-3])
file_to_remove = os.path.join(source_path, source_filename[:-3] + '.spec')
command_line = 'pyinstaller -wF "{}" {} {} {} {}'.format(source_file, icon_option, workpath_option,
dispath_option, specpath_option)
if button == 'Make EXE':
try:
prt('source_file: ' + str(source_file))
prt('Making EXE... this will take a while.. the program has NOT locked up...')
window.Refresh()
prt('window.Refresh')
window.Refresh()
prt('Running command: {}'.format(command_line))
runCommand(command_line)
shutil.rmtree(folder_to_remove)
os.remove(file_to_remove)
prt('**** DONE ****')
except Exception as e:
# sg.PopupError('Something went wrong')
prt("Launcher, Exception = " + e)
def runCommand(cmd, timeout=None):
""" run shell command
<strong i="6">@param</strong> cmd: command to execute
<strong i="7">@param</strong> timeout: timeout for command execution
<strong i="8">@return</strong>: (return code from command, command output)
"""
prt('runCommand, cmd = ' + str(cmd))
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
prt('runCommand, communicate')
out, err = p.communicate()
prt('runCommand, wait')
p.wait(timeout)
prt(out)
prt(err)
return (out, err)
if __name__ == '__main__':
Launcher()
这是 PyInstaller 的一个问题。 如果您不将其转换为 EXE 文件,我认为一切运行良好。 过去,由于 PyInstaller 问题,我无法将您在 GitHub 上找到的启动器演示程序转换为 EXE 文件。
我建议在 subprocess 调用和 PyInstaller 的更一般的问题上检查 stackoverflow 或其他地方。
如果你去掉所有的 PySimpleGUI 代码,只从你的 EXE 文件中调用子进程调用,那有问题吗? 您可以尝试对其进行硬编码并运行测试吗?
“如果你不把它变成 EXE 文件,我认为一切都运行良好”
是的。
“如果你去掉所有的 PySimpleGUI 代码,只从你的 EXE 文件中调用子进程调用,那会有问题吗?”
好的,我删除了所有 PySimpleGUI 代码,但它仍然崩溃。 所以它与 PySimpleGUI 无关 :)
那么 PySimpleGUI 是否支持其他 EXE 打包程序,而不是 pyinstaller?
通过改变这个来解决:
p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE)
谢谢!!!!!!!!!
我一直在尝试解决这个问题一段时间。 我非常感谢您不仅挖掘并找到解决方案,而且还回来并发布它。 非常感激!
最有用的评论
通过改变这个来解决:
p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,stdin=subprocess.PIPE)