首页 > 编程语言 >用pyinstaller打包,生成单个的exe程序,找不到资源文件怎么办?

用pyinstaller打包,生成单个的exe程序,找不到资源文件怎么办?

时间:2024-05-14 16:11:51浏览次数:18  
标签:文件 exe pyinstaller 程序 sys 打包

被这个问题生生搅了两个月。   那还是在3月底的时候,我们这个程序啊,并不是BS架构的。写好之后,肯定不能把一堆py源码发给客户嘛,要使用pyinstaller打包的,做成一个exe的可执行程序。 pyinstaller怎么使用我就不教了,这个不是今天想说的重点,而且网上的教程还是很全面的。   我想说的是,如果你在程序中打开文件,并且使用相对路径的话,用pyinstaller打包成单个的exe文件(指加上了-F选项),之后你直接用exe程序来找,是找不到文件的。   原因是:这个单个的exe程序,在执行的时候,会先解压出一堆运行环境,放在C盘临时文件目录下生成的一个_MEIxxxxx的文件夹(xxxxx是随机数字)中,而程序默认的根路径,正是这个目录。因此我们的程序在打开相对路径的文件时,也是从这个目录查起。结果当然就是找不到文件。   对于这个问题的解决方法,网上通常是有两种:一种是,将文件一起打包进exe文件中,也就是在pyinstaller打包时命令加上 --add-data 选项。另一种是,在程序中用代码找到当前执行的临时目录,然后以此为起点去找程序中调用的目录。   参考文章:https://blog.csdn.net/qq_26373925/article/details/105524318   但是两种方法对我这来说都不是很合适。我这边会通过程序写一些文件,如果这次退出程序,下次一样找不到这些文件。于是,两个月以来,我使用的方法都是:直接写绝对路径。我知道这种方法不是很好,但实在也是无奈。
  直到我无意中看到了这篇文章: https://blog.csdn.net/Dear_Merlin/article/details/137431572 才知道事情居然如此简单。   我们都知道,一个python程序,如果在命令行执行时,是这样的:  

python some_python_code.py arg1 arg2 arg3  
  如果在代码中想接收这些参数,可以使用sys模块:  
import sys
print(sys.argv)

 

可以看到这个结果是一个列表:  
["some_python_code.py", "arg1", "arg2", "arg3"]

 

但是,如果我们打包的exe程序在执行时,sys.argv[0] 显示的是这个exe的名称。如果再用 os.path.abspath(sys.argv[0]) 的话,得到的就是exe所在位置的绝对路径了。再进一步,  
BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0]))

 

那么BASE_DIR的结果就是exe所在的目录了。这正是我想要的结果,这样的话,我就可以把exe程序放在任意目录,而资源文件的读写也可以使用相对路径来读到了。   

标签:文件,exe,pyinstaller,程序,sys,打包
From: https://www.cnblogs.com/anpengapple/p/18191518

相关文章

  • 阿里云Windows server 2016服务器Antimalware Service Executable进程占比高,cpu接近10
    问题描述:阿里云Windowsserver2016服务器AntimalwareServiceExecutable进程占比高,cpu接近100%,需要强制关闭该进程,排查问题,进入系统服务关闭,提示拒绝访问(该服务关闭后有风险,需评估后操作)  操作步骤:1.进入服务器,进入Windowspowershell界面; 2. 输入 regadd"HKEY_L......
  • APP - 签名打包布发
    APP-签名打包布发布 1. 生成密钥库文件打开项目,进入 android 文件夹目录,使用控制台执行命令,文中测试密钥使用:123456keytool-genkey-v-keystoreawerncd-release-key.keystore-aliasawerncd-release-key-keyalgRSA-keysize2048-validity10000  这条命令......
  • vite 自定义插件获取打包时长
    //vite.config.ts//打包时间functionbuildTimePlugin(mode){console.log('mode:>>',mode)return{name:'build-time',//在buildStart阶段设置初始值buildStart(){this.startTime=Date.now()if(mode!==&......
  • react native 项目使用 Xcode 打包上架 App Store
    一、创建证书、标识符和描述文件等:1.前提条件可正常运行和打包的代码、Apple开发者账号点击注册Apple开发者账号注册完进入页面可以看到证书、标识符和描述文件创建入口2.创建AppID点击Identifiers旁边的加号选择AppIDs,点击Continue。选择App,点击Conti......
  • inno Setup 打包Java exe可执行文件和MySQL数据库,无需额外配置实现一键傻瓜式安装
    前言出现有需要打包Java应用和Mysql数据库成一个安装包给出去的需求,这里我把整个打包的流程整理一下。环境JDK17;MySQL5.7;流程Jpackage打包EXEJpackage是JDK14后加入的一个用于独立打包的工具,能够将应用打包成exe,有了Jpackage就不需要用exe4j这种打包工具,省去打包的繁......
  • pyinstaller和py2app用法
    pyinstaller:pip3installpyinstaller#简单操作进入需要打包的文件下面,执行pyinstaller-F-ctest.py会生成一个2个文件夹,去dist文件下运行.exe文件注释:mac生成的文件放到其他mac上无法执行。py2app:pip3installpy2app到文件夹目录下:执行 py2applet--make-setuples_......
  • 项目打包与上线
    目录1.修改好上线环境中的请求地址2.打包项目3.连接服务器4.配置nginx代理5.上线成功1.修改好上线环境中的请求地址2.打包项目进入项目根目录,输入npmrunbuild解决报错问题当我们无法解决多而烦的ts检查报错时,可以在项目中的package.json文件中把下图中原本的红色框内......
  • ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'
    前言最近有个需求,需要在ubnutu22上使用pyinstaller打包一个python2的文件。中间遇到了一些问题:pip2installpyinstaller报错解决方案:pip2installpyinstaller==3.6python2和python3的pyinstaller如何同时存在,我想把python2的pyinstaller命名为pyin......
  • docker打包前端项目/flask项目
    1.docker安装我安装的是dockerdesktop安装完成后$docker-v$Dockerversion26.0.0,build2ae903e同时也可以打开图形界面看2.前端打包配置Dockerfile放在前端项目根目录配置nginx.conf放在前端项目根目录---Dockerfile#设置Node.js版本FROMnode:20.12.2#设置容器工......
  • maven 打包 pom build
     <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1......