跳至主要內容

Python项目打包

Jelly大约 2 分钟PythonPyinstallerPython

Pyinstaller

当做一个项目需要打包时,不免会遇到将项目打包成可执行文件的问题,这个时候就要用到pyinstaller这个包了

首先要解决一个重要的问题,python文件在vscode中的项目路径和cmd打开的项目路径时不一样的,当项目中用到IO操作,或者相对路径引用时会出问题——找不到相关文件,因此需要在项目的启动文件加上

os.chdir(os.path.dirname(__file__))

表示把当前文件所在的文件夹作为项目的启动路径。**file**可以获取当前执行的文件所在的绝对路径,**os.path.dirname(file)**可以通过文件绝对路径获取文件所在的文件夹的绝对路径,**os.chdir(path)**而则是将运行目录切换到该文件所在的文件夹下

但实践后我发现,打包后的exe文件运行目录在C盘下的一个缓存目录里,运行完后会把所生成的文件清除,这导致并不能像运行py那样在当前exe所在下生成文件,需要引入一个冻结路径,创建一个py文件在要打包的文件下

-*- coding: utf-8 -*-
import sys
import os

def app_path():
    """Returns the base application path."""
    if hasattr(sys, 'frozen'):
        # Handles PyInstaller
        return os.path.dirname(sys.executable)       #使用pyinstaller打包后的exe目录
    return os.path.dirname(__file__)                 #没打包前的py目录

当需要IO操作时使用如下代码,其中relative_path为以exe所在文件夹为项目路径的相对路径

file = frozen_dir.app_path()+'relative_path'
dirname = os.path.dirname(file)
if not os.path.exists(dirname):
    os.mkdir(dirname)

在打包时需要使用-D参数,如果使用-F生成单文件则无法实现exe所在目录的相对路径读写. (-D是生成可执行项目, -F是生成可执行文件)

Pyinstaller -i xx.ico -D main.py

其中参数-i xx.ico可以为可执行文件指定图标

另外-n Name可以对可执行项目命名, -h|–help可以获取具体的使用方法