You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中将.exe文件作为资源嵌入另一个.exe文件中?

如何将adb.exe嵌入PyInstaller打包的独立可执行文件中

我来帮你搞定这个问题!你需要把adb.exe作为资源打包进你的exe,然后在程序运行时把它提取到临时目录再调用——这样就不用依赖外部的adb路径,也不用用户自己装adb了。下面是具体步骤:

1. 整理文件结构

  • 把你的Python脚本(比如命名为main.py)和adb.exe放在同一个文件夹里,同时别忘了把adb依赖的AdbWinApi.dllAdbWinUsbApi.dll也一起放进来(这两个文件是adb在Windows上运行必需的)。

2. 修改Python代码,实现运行时提取adb

PyInstaller打包后,会把嵌入的资源存放在一个临时目录里,我们可以通过sys._MEIPASS获取这个路径。修改你的代码,让程序自动处理adb的提取和调用:

import subprocess
import sys
import os
import tempfile

def get_adb_path():
    # 判断当前是否是PyInstaller打包后的运行环境
    if hasattr(sys, '_MEIPASS'):
        # 打包后的资源根目录
        resource_dir = sys._MEIPASS
    else:
        # 开发环境下,资源和脚本同目录
        resource_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 源文件路径
    adb_src = os.path.join(resource_dir, 'adb.exe')
    dll1_src = os.path.join(resource_dir, 'AdbWinApi.dll')
    dll2_src = os.path.join(resource_dir, 'AdbWinUsbApi.dll')
    
    # 创建临时目录存放adb文件,避免权限冲突
    temp_dir = tempfile.gettempdir()
    adb_dest = os.path.join(temp_dir, 'adb.exe')
    dll1_dest = os.path.join(temp_dir, 'AdbWinApi.dll')
    dll2_dest = os.path.join(temp_dir, 'AdbWinUsbApi.dll')
    
    # 复制文件到临时目录(仅当源文件更新或目标不存在时复制)
    def copy_file(src, dest):
        if not os.path.exists(dest) or os.path.getmtime(src) > os.path.getmtime(dest):
            with open(src, 'rb') as f_src:
                with open(dest, 'wb') as f_dest:
                    f_dest.write(f_src.read())
    
    copy_file(adb_src, adb_dest)
    copy_file(dll1_src, dll1_dest)
    copy_file(dll2_src, dll2_dest)
    
    return adb_dest

# 调用adb获取系统版本
adb_path = get_adb_path()
# 用引号包裹路径,避免路径含空格时出错
ver = subprocess.call(f'"{adb_path}" shell getprop ro.build.version.release')

3. 使用PyInstaller打包

打开命令提示符,进入脚本所在的文件夹,运行以下命令:

pyinstaller --onefile --add-data "adb.exe;." --add-data "AdbWinApi.dll;." --add-data "AdbWinUsbApi.dll;." main.py

参数说明:

  • --onefile:将所有内容打包成单个独立的exe文件
  • --add-data "文件名;.":指定要嵌入的资源文件,分号前是源文件路径,分号后是打包后资源的相对路径(这里.表示和程序运行时的临时目录同层级)

4. 测试打包后的程序

打包完成后,在脚本目录的dist文件夹里找到生成的main.exe,双击运行即可。它会自动提取adb到系统临时目录并执行命令,不需要额外的Python环境或adb工具。

小提示:临时目录里的adb文件会被系统定期清理,你也可以在程序退出时手动删除这些文件,避免占用磁盘空间。

内容的提问来源于stack exchange,提问作者tahsinocity

火山引擎 最新活动