吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1240|回复: 10
收起左侧

[求助] 小白求教:在vscode中用pyinstaller打包exe后运行时有黑窗怎么解决?

[复制链接]
kentoo 发表于 2023-5-29 19:28
刚接触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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zero57 发表于 2023-5-29 21:40
带这个参数-Fw试试
 楼主| kentoo 发表于 2023-5-29 22:24
zero57 发表于 2023-5-29 21:40
带这个参数-Fw试试

感谢回复,但是依然没有效果 ,我是这样写的
pyinstaller --onefile 成品可用0005窗口测试5.py -Fw
生成的exe 在运行的时候还是有很多黑窗口弹出来,里面没有任何字只是一个黑框,然后自动关闭。
软件界面是正常显示的,也正常运行。代码有500行,很多步骤。
 楼主| kentoo 发表于 2023-5-29 23:15
又尝试了这样的方法
pyinstaller --onefile -w -F 成品可用0005窗口测试5.py
import time



# 增加一段停留时间
time.sleep(2)

# 显示主窗体
mainwindow.show()
hrpzcf 发表于 2023-5-29 23:17
你查一下subprocess的用法,有参数可以设置运行第三方程序时是否显示cmd窗口的,懒得说了,反正有chatgpt可以查
 楼主| kentoo 发表于 2023-5-30 00:10
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 时,需要注意避免执行会导致窗口弹出的命令。

要确定库是否支持静态链接,你可以查阅库的官方文档或在库的源代码仓库中寻找相关信息。另外,还可以尝试在打包工具的配置中查找有关静态链接的选项和说明。

但目前还在研究中……
 楼主| kentoo 发表于 2023-5-30 00:32
尝试用 pyinstaller 和auto_py_to_exe 用下面参数生成 exe ,每个循环还会有7个弹窗……其中一个确实是音频合成的黑色窗口,其他的看不清,一闪就过去了。
pyinstaller --onefile --noconsole -F -w --hidden-import pydub 成品可用0005窗口测试5.py

大白baymax 发表于 2023-5-30 07:32
可以加个input
lbbas 发表于 2023-5-31 10:26
kentoo 发表于 2023-5-30 00:10
感谢回复 目前查到这一步了:
如果你的代码调用了其他软件或库,在将代码打包成可执行文件(exe)后,运 ...

试试搜搜subprocess静默模式
 楼主| kentoo 发表于 2023-5-31 16:29
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)
还是没有效果
我知道这句是什么意思,但不知道为什么这样写……
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表