Python打包exe文件方法pyinstaller

Python打包exe文件方法pyinstaller

优点:

可将python文件转成可执行文件
跨平台
输出的可以是单一目录,也可以是一个单独的打好包的可执行文件。py2exe貌似输出目录。
智能支持python的第三方模块如PyQt,外部数据文件等
支持EGG格式文件
可执行文件可以用UPX压缩,二进制压缩方式
支持控制台和视窗两种方式。
可以选择exe文件的图标 (Windows only)
支持 COM server (Windows only)
缺点:
import导入的问题

安装

pip install pyinstaller

打包

pyinstaller -F app.py  # 直接用这个
pyinstaller -D -p F:\Python27\Lib -i logo.ico mian.py

  
-D:打包成多个文件
-p:指定python安装包路径
-i:指定图标,我的图标放在同目录下
mian.py:要打包的文件,和图标放在同目录下了

多进程打包

如果py程序是多进程的话,使用pyinstaller打包会出现错误,这个时候只要加上一行代码

在:
if name==‘mian’:
#新增
multiprocessing.freeze_support()

打包文件执行路径问题解决

BASE_PATH:打包后的执行文件所在路径
if getattr(sys, 'frozen', False):
    BASE_PATH = os.path.dirname(sys.executable)
elif __file__:
    BASE_PATH = os.path.dirname(__file__)

下载图片工具打包

pyinstaller -F download.py

download.py

import os
import xlrd
import requests
import sys


if getattr(sys, 'frozen', False):
    BASE_PATH = os.path.dirname(sys.executable)
elif __file__:
    BASE_PATH = os.path.dirname(__file__)

def download_image(dirname, video_id, image_url):
    """
    dirname:目录名字
    video_id:保存图片到名字
    image_url:图片下载地址
    """
    global BASE_PATH
    BASE_PATH2 = os.path.split(BASE_PATH)[0]
    video_id = str(video_id).strip()
    image_path = os.path.join(BASE_PATH2, "image")  # 电影总目录image
    if not os.path.isdir(image_path):
        os.mkdir(image_path)
    image_path_dir = os.path.join(image_path, dirname)  # 电影目录
    if not os.path.isdir(image_path_dir):
        os.mkdir(image_path_dir)
    image_path = os.path.join(image_path_dir, video_id) + ".jpg"  # 图片路径
    for i in range(10):
        try:
            response = requests.get(image_url, timeout=10)
            if response.status_code != 200:
                continue
            data = response.iter_content()
            with open(image_path, 'wb')as f:
                for line in data:
                    f.write(line)
                f.close()
            break
        except Exception as e:
            continue


def get_excel_data():
    """
    dirname:目录名字
    video_id:保存图片到名字
    image_url:图片下载地址
    """
    print("开始读取文件中。。。。")
    xlsfile = get_excel_dir()
    # xlsfile = input("输入需要下载的excel绝对文件路径:")
    book = xlrd.open_workbook(xlsfile)
    sheet0 = book.sheets()[0]
    video_ids = sheet0.col_values(0)
    urls = sheet0.col_values(7)
    lis = list(zip(video_ids, urls))
    dir_name = os.path.basename(xlsfile).split(".",1)[0]
    dir_name = f"视频封面-{dir_name}"
    print("开始下载中。。。")
    for li in lis:
        video_id = li[0]
        url = li[1]
        try:
            download_image(dir_name, video_id, url)
        except:
            continue
    print("下载完毕!")


def get_excel_dir():
    global BASE_PATH
    path = os.path.split(BASE_PATH)[0]
    excel_path = os.path.join(path, "excel")
    exlec_list = os.listdir(excel_path)
    for i, k in enumerate(exlec_list):
        print(i, ":", k)
    excel_number = int(input("请选择要下载的excel文件件名编号:").strip())
    excel_name = os.path.join(excel_path, exlec_list[excel_number])
    return excel_name

if __name__ == '__main__':
    get_excel_data()
    pass

posted @ 2021-04-06 16:48  Jeff的技术栈  阅读(210)  评论(0编辑  收藏  举报
回顶部