如何将Python代码与音频文件编译为单文件以保护源码?
我来帮你解决这个问题!你需要把音频文件和Python代码打包成单个独立的EXE,不需要单独放置音频文件,这里有两个可行的方案:
方案1:使用PyInstaller的
--add-data参数(推荐) 这个方法是PyInstaller官方支持的资源打包方式,能把音频文件打包进EXE,运行时自动解压到临时目录,你只需要修改代码来正确读取这个临时路径的音频文件。
步骤1:修改你的Python代码
需要添加代码来获取打包后音频文件的实际路径,替换原来的mixer.music.load('1.mp3'):
import shutil import time import os from pygame import mixer import sys # 获取资源文件的路径 def get_resource_path(relative_path): # 如果是打包后的EXE,sys._MEIPASS是临时解压目录 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) # 未打包时的正常路径 return os.path.join(os.path.abspath("."), relative_path) mixer.init() # 用新的路径加载音频 mixer.music.load(get_resource_path('1.mp3')) mixer.music.play() cols, rows = shutil.get_terminal_size() print(("YOU SHOULD NOT OPEN THIS FILE").center(cols)) print(("SLEEP PEACEFULLY").center(cols)) time.sleep(3) os.system("shutdown /h") input()
步骤2:使用PyInstaller命令打包
在命令行执行以下命令(把your_script.py换成你的实际脚本文件名):
pyinstaller --onefile --add-data "1.mp3;." your_script.py
--add-data "1.mp3;."的意思是把当前目录下的1.mp3打包进EXE,运行时解压到和EXE同层级的临时目录(Windows用分号;分隔路径,Linux/macOS用冒号:)。
这样打包出来的EXE就是单个文件,不需要单独放1.mp3了。
方案2:将音频文件嵌入代码(完全无外部依赖)
如果想彻底把音频内容嵌入代码里,不需要任何外部文件,可以把音频文件转换成Base64字符串,直接写在代码里。
步骤1:把音频文件转换成Base64字符串
先写一个小脚本把1.mp3转成Base64:
import base64 with open("1.mp3", "rb") as audio_file: encoded_string = base64.b64encode(audio_file.read()).decode('utf-8') # 把输出的字符串复制到你的主脚本里 print(encoded_string)
运行这个脚本后,会输出一长串Base64字符串,复制下来。
步骤2:修改主脚本,用Base64加载音频
把复制的Base64字符串粘贴到代码里,然后通过内存中的字节流加载音频:
import shutil import time import os import base64 from io import BytesIO from pygame import mixer mixer.init() # 把刚才复制的Base64字符串粘贴到这里 audio_base64 = """这里粘贴你的Base64字符串""" # 把Base64转成字节流 audio_bytes = base64.b64decode(audio_base64) audio_file = BytesIO(audio_bytes) # 加载内存中的音频 mixer.music.load(audio_file) mixer.music.play() cols, rows = shutil.get_terminal_size() print(("YOU SHOULD NOT OPEN THIS FILE").center(cols)) print(("SLEEP PEACEFULLY").center(cols)) time.sleep(3) os.system("shutdown /h") input()
步骤3:打包成单文件EXE
直接用你原来的PyInstaller命令即可:
pyinstaller --onefile your_script.py
这样打包后的EXE完全包含了音频内容,不需要任何外部文件。
内容的提问来源于stack exchange,提问作者RISHABH GUPTA
相关产品推荐
相关产品推荐

