将python项目打包成exe可执行文件(多个文件和素材)

  • Post author:
  • Post category:python




一.将单个文件打包



1.安装Pyinstaller模块



2.在Pycharm中的Terminal输入命令:“pyinstaller -F -w XXX.py” 就可以制作出exe。

在cmd中:先cd到项目目录下再输入命令。例如:pyinstaller -F -w -i g:\2345Downloads\logo.ico login.py



Notice:(g:\2345Downloads\logo.ico)为图标路径。


/**
*附参数集合:

–icon=[图标路径](http://www.icontuku.com/)(pyinstaller -F --icon=my.ico XXXX.py)
-F 打包成一个exe文件
-w 小写,使用窗口,无控制台
-c 使用控制台,无窗口
-D 创建一个目录,里面包含exe以及其他一些依赖性文件 
-i  这里的i也是小写的,意思是忽略打包过程中遇到的错误,就是遇到错误也继续执行
*
*/


生成的文件放在同目录dist下。不加-F参数生成一堆文件,但运行快。压缩后比单个exe文件还小一点点。 加-F参数生成一个exe文件,运行起来慢。



二.将多个文件和素材打包



命令:(cmd下打包多个文件,第一个为主文件)



1 >pyinstaller -F -w -i g:\2345Downloads\logo.ico login.py



–hidden-import doTest.py –hidden-import itemContent –hidden-import queryDB.py



–hidden-import view.py –hidden-import Applications.py –hidden-import mainWindow.py



**解释:进入到cmd命令行中,然后cd到我们的项目代码所在的具体的目录,在项目代码所在的目录中,使用上述代码进行打包。



这里没有在项目里放置更多的文件夹,一些代码文件都是散放在主文件夹中,在 pyinstaller -F -w -i之后放的是我们需要最终显示的图标的绝对路径,之后的第一个Python文件就是这个项目的主文件,之后使用–hidden-import导入这个项目中的一些其他的Python文件。



如果我们是把一些具体功能的Python文件放在了一个具体的文件夹里,那么我们就可以使用-p 文件夹名,例如:



我们假设我们创建了一个sql文件夹,用来放一些处理数据库的Python文件,这里假设有mysql.py**



项目包含素材



1.此方法只能在本机中运行



如果项目中含有图片,我们需要将代码中对图片的引用变成绝对路径,而不是相对路径,如果不适用绝对路径,在执行打包的过程不会报错,也能正常生成EXE文件,但是当我们在执行它时,会提示一个错误:fail to execute script login(这里是你的程序入口的文件的文件名),如果想要看到点击EXE文件之后报的错误,我们可以将目录中的login.spec文件中的console=True,默认是False,所以如果设置为True之后,就会将错误信息显示在命令行窗口中。如果不想让程序打开时同时显示控制台黑色框可以,将图中console=True改为console=False

# -*- mode: python -*-
 
block_cipher = None
 
 
a = Analysis(['login.py'],
             pathex=['F:\\python_project_reveiw'],
             binaries=[],
             datas=[],
             hiddenimports=['doTest.py', 'itemContent', 'queryDB.py', 'view.py', 'Applications.py', 'mainWindow.py'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='login',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False , icon='g:\\2345Downloads\\logo.ico')



当我们设置完那些参数之后,我们就可以直接对login.spec文件进行打包了,命令如下:pyinstaller -F -w -i g:\2345Downloads\logo.ico login.spec



最后生成的EXE文件会替换掉之前生成的EXE文件。



Notice:32位的操作系统不能运行64位python打包的exe文件。



2.在任何电脑中都能运行(图片)


1.Pic2py.py : 图片转为.py

import base64
 
def pic2py(picture_names, py_name):
    """
    将图像文件转换为py文件
    :param picture_name:
    :return:
    """
    write_data = []
    for picture_name in picture_names:
	    filename = picture_name.replace('.', '_')
	    open_pic = open("%s" % picture_name, 'rb')
	    b64str = base64.b64encode(open_pic.read())
	    open_pic.close()
	    # 注意这边b64str一定要加上.decode()
	    write_data.append('%s = "%s"\n' % (filename, b64str.decode()))

    f = open('%s.py' % py_name, 'w+')
    for data in write_data:
    	f.write(data)
    f.close()
 
if __name__ == '__main__':
    pics = ["icon.ico", "weixin.gif", "alipay.gif"]
    pic2py(pics, 'memory_pic')	 # 将pics里面的图片写到 memory_pic.py 中
    print("ok")


2 在程序中引用

from memory_pic import *		

def get_pic(pic_code, pic_name):
    image = open(pic_name, 'wb')
    image.write(b64decode(pic_code))
    image.close()

get_pic(icon_ico, 'icon_ico')
# 在这里使用图片 icon.ico
os.remove('icon.ico')




打包的exe文件太大?



原因



由于使用pyinstaller打包.py文件时,会把很多已安装的无关库同时打包进去,导致打包生成的.exe文件体积过大。



解决办法



使用pipenv创建虚拟python环境,在虚拟环境中安装.py文件所用到的库(即py文件中import 的第三方库),然后在pipenv所创建的虚拟环境中使用pip安装打包所用到的pyinstaller。注意:本机安装过pyinstaller的也要重新进入虚拟环境中安装,不然会使用pyinstaller命令打包时,还是会生成大体积的.exe可执行文件。



具体步骤如下:

1、在命令行使用pip命令安装pipenv库,用于创建虚拟环境



pip install pipenv

1

2、新建一个准备当环境的文件夹,并cd进入该文件夹

3、建立虚拟环境



pipenv install

1

4、进入虚拟环境(以下操作皆为虚拟环境下的操作)



pipenv shell

1

5、安装.py文件用到的模块



pip install 【.py用到的模块】

1

6、安装pyinstaller模块,用于打包.py文件



pip install pyinstaller

1

7、使用pyinstaller打包文件



pyinstaller -Fw E:\pipenvtest\test.py(.py文件根据实际情况更改)

8、结果文件

运行完第7步之后,在目录下回生成‘dist’文件夹,里面存放的就是结果文件。


参考文献


关注公众号【轻松玩编程】回复关键字

激活码

即可获取:全家桶通用激活码(激活码支持idea,pycharm,webstorm,phpstorm…激活)定期更新。适用于最新及以下版本。(无需破解和修改hosts,如果破解过请卸载重新安装官方原版,如果修改过hosts,请删除你添加的网址,然后重新激活)


回复关键字“电子书”,“计算机资源”,“Java从入门到进阶”,”JavaScript教程“,“算法”,“Python学习资源”,“人工智能”等即可获取学习资源。


在这里插入图片描述



版权声明:本文为jiahuan_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。