小白求教:在vscode中用pyinstaller打包exe后运行时有黑窗怎么解决?
刚接触python不到一个月,不认识代码,只知道大概结构,问gpt写的一段代码,开头用了这些,在vscode里面能正常运行 ,没有任何错误,
但是用pyinstaller导出成单个exe文件,运行时总闪出好多cmd窗口 ,然后自动关闭,软件似乎还是正常运行状态,就是很卡。
尝试过很多网上的方法,在pyinstaller后面加各种参数, -n -w 什么的,
还有这些:-onefile --hidden-import=os --hidden-import=shutil --hidden-import=tkinter --hidden-import=tkinter.filedialog --hidden-import=subprocess --hidden-import=json -w --noconsole
还有py文件名位pyw
os * 什么库 改成其他的,
换了两个打包软件,都没有解决。我还是喜欢这个打包软件pyinstaller ,
就是不知道该怎么办了……希望有大神指点一下……
给个大概方向就行, 我真的不认识代码
import os
import shutil
import tkinter as tk
from tkinter import filedialog
import subprocess
import json
带这个参数-Fw试试 zero57 发表于 2023-5-29 21:40
带这个参数-Fw试试
感谢回复,但是依然没有效果 ,我是这样写的
pyinstaller --onefile 成品可用0005窗口测试5.py -Fw
生成的exe 在运行的时候还是有很多黑窗口弹出来,里面没有任何字只是一个黑框,然后自动关闭。
软件界面是正常显示的,也正常运行。代码有500行,很多步骤。 又尝试了这样的方法
pyinstaller --onefile -w -F 成品可用0005窗口测试5.py
import time
# 增加一段停留时间
time.sleep(2)
# 显示主窗体
mainwindow.show() 你查一下subprocess的用法,有参数可以设置运行第三方程序时是否显示cmd窗口的,懒得说了,反正有chatgpt可以查 hrpzcf 发表于 2023-5-29 23:17
你查一下subprocess的用法,有参数可以设置运行第三方程序时是否显示cmd窗口的,懒得说了,反正有chatgpt可 ...
感谢回复 目前查到这一步了:
如果你的代码调用了其他软件或库,在将代码打包成可执行文件(exe)后,运行时可能会出现弹出窗口的情况。这是因为打包工具将代码和依赖项打包在一起,当代码需要调用其他软件或库时,它们也会被执行。
解决办法是:
尝试使用静态链接:有些库支持静态链接,这意味着将库的功能直接嵌入到可执行文件中,而不是作为外部依赖。这可以减少对其他软件或库的依赖,进而减少弹出窗口的可能性。查看所使用库的文档,了解是否支持静态链接以及如何配置。
不是所有的库都支持静态链接,这取决于库本身的实现和功能需求。以下是你提到的几个库的静态链接支持情况:
os、random、time、shutil、tkinter:这些库是 Python 的标准库,通常会被静态链接到可执行文件中,而无需额外的配置。
pydub:pydub 是一个音频处理库,它依赖于 FFmpeg 或 Libav 这样的外部库来处理音频文件。在打包时,你可以尝试将 FFmpeg 或 Libav 静态链接到可执行文件中,以避免对这些外部库的依赖。查看 pydub 的文档,了解如何配置静态链接或打包 FFmpeg 或 Libav。
subprocess:subprocess 是 Python 的一个模块,用于在代码中执行外部命令。它会调用操作系统的命令行执行指定的命令,并将其输出返回给 Python。由于 subprocess 是与操作系统交互的模块,它可能会触发其他软件的运行并导致窗口弹出。在使用 subprocess 时,需要注意避免执行会导致窗口弹出的命令。
要确定库是否支持静态链接,你可以查阅库的官方文档或在库的源代码仓库中寻找相关信息。另外,还可以尝试在打包工具的配置中查找有关静态链接的选项和说明。
但目前还在研究中…… 尝试用 pyinstaller 和auto_py_to_exe 用下面参数生成 exe ,每个循环还会有7个弹窗……其中一个确实是音频合成的黑色窗口,其他的看不清,一闪就过去了。
pyinstaller --onefile --noconsole -F -w --hidden-import pydub 成品可用0005窗口测试5.py
可以加个input kentoo 发表于 2023-5-30 00:10
感谢回复 目前查到这一步了:
如果你的代码调用了其他软件或库,在将代码打包成可执行文件(exe)后,运 ...
试试搜搜subprocess静默模式 lbbas 发表于 2023-5-31 10:26
试试搜搜subprocess静默模式
我的部分代码是这样的:
感觉是这部分的原因
def refresh_bgm_files():
bgm_files.clear()
for filename in os.listdir(bgm_folder):
if filename.endswith('.mp3'):
bgm_files.append(filename)
random.shuffle(bgm_files)
used_bgm_files = []
for mp3_file in mp3_files:
final_audio = AudioSegment.silent(duration=0)
if header_file:
header = AudioSegment.from_file(header_file)
final_audio += header
audio = AudioSegment.from_file(os.path.join(folder, mp3_file))
final_audio += audio
if footer_file:
footer = AudioSegment.from_file(footer_file)
final_audio += footer
if not bgm_files:
refresh_bgm_files()
mp3_duration = len(final_audio)
current_duration = 0
current_bgm_files = []
while current_duration < mp3_duration:
# 暂停停止参数
if stop_flag:
break
if pause_flag:
time.sleep(0.1)
continue
bgm_file = bgm_files.pop(0)
bgm = AudioSegment.from_file(os.path.join(bgm_folder, bgm_file))
current_bgm_files.append(bgm_file)
current_audio_duration = len(bgm) if current_duration + len(bgm) <= mp3_duration else mp3_duration - current_duration
current_audio = bgm[:current_audio_duration]
fade_in_duration = fade_out_duration = fade_duration // 2
current_audio = current_audio.fade_in(fade_in_duration).fade_out(fade_out_duration)
final_audio = final_audio.overlay(current_audio, position=current_duration)
current_duration += current_audio_duration
if not bgm_files:
refresh_bgm_files()
used_bgm_files.append(current_bgm_files)
output_filename = os.path.basename(mp3_file) + '_bgm'
if header_file:
output_filename += '_header'
if footer_file:
output_filename += '_footer'
output_file = os.path.join(output_folder, output_filename + '.mp3')
final_audio.export(output_file, format='mp3', bitrate='256k')
# print(f'Successfully created {output_file}')
result_text.insert(tk.END, f'已合成 {output_file}\n')
result_text.update()
result_text.see(tk.END)
# 暂停停止参数
if stop_flag:
break
txt_file = os.path.join(output_folder, 'mp3_bgm_files.txt')
with open(txt_file, 'w') as f:
for i, mp3_file in enumerate(mp3_files):
f.write(f'{mp3_file}: ')
f.write(','.join(used_bgm_files))
f.write('\n')
试着将
final_audio.export(output_file, format='mp3', bitrate='256k')
改为
cmd_line = f'ffmpeg.exe -i "{os.path.join(folder, mp3_file)}" -f mp3 "{output_file}"'
subprocess.Popen(cmd_line, creationflags=subprocess.CREATE_NO_WINDOW)
还是没有效果
我知道这句是什么意思,但不知道为什么这样写……
页:
[1]
2