首页 > 编程语言 >python项目打包指南

python项目打包指南

时间:2024-11-06 17:41:03浏览次数:1  
标签:指南 文件 run settings python py __ 打包

# Python是解释型语言,我们写的Flask或Django项目如果部署,
# 源码可能会泄露,因此我们可以把项目打包成exe,来保护源码
# 需要用到工具
-pyinstaller:把python项目打包成不同平台的可执行文件

-nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下
安装程序制作程序,它提供了安装、卸载、系统设置、文件解压缩等功能。
这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的

pip install pyinstaller

# 1 假设项目的启动文件是  run.py
# 2 pyinstaller -D run.py   打包项目文件

# 3 可以看到项目路径下 多了:
  build文件夹     用于构建可执行文件
  dist文件夹      包含应用程序的所有依赖项和可执行文件
  run.spec        配置文件

    
# 4 如果项目代码里面涉及到一些不是.py文件(比如静态文件),但是项目里面又用到了这些静态文件
	# pyinstaller模块是无法打包   这些非.py文件的!!!  
	那么你直接打包命令执行后,运行run.exe 是会有问题的, 打包的二进制文件里,会找不到该静态文件的
    
    
    
# 5 要把run.spec配置文件修改一下才行   然后再运行 pyinstaller .\run.spec 重新打包
	datas=[('templates/index.html', 'templates'), ('static/style.css', 'static')],
    datas=[('config.json', '.')],
    # 元祖里第一个元素代表你希望在打包时包含的数据文件名称,该文件放到哪个目录下
    # 打包完就可以看到dist/_internal/目录下有了对应的静态文件了!!!
    # 就是把对应的 非py文件,也放到 dist/_internal/目录下   
    # 这样当二进制的run.exe运行时,就能找到这些非py文件了
    
    
    
可选参数 示例 说明
-F pyinstaller -F run.py 只在dist文件夹中生成一个程序run.exe文件,适用于没有多依赖.py文件
-D pyinstaller -D run.py 默认选项,除了主程序run.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用这个,不容易出报错
-i pyinstaller -i D:\demo.ico run.py 给生成的demo.exe文件设置一个自定义的图标

项目中如果有些.py文件不想打包,比如配置文件,方便后续修改,怎么办

项目的启动文件run.py打包后,会在项目根目录下生成一个run.spec配置文件
# 然后在Analysis里面,datas对应写好对应的 非.py文件(比如一些静态文件)

pyinstaller .\run.spec    # 重新打包

这样在 dist/_internal/目录下就可以看到,该不想打包的非.py文件
这样再次双击运行该run.exe     python项目就起来了
# 想改配置,就直接在不想打包的非.py文件里改好保存,重启run.exe,新配置就生效了!!!

a = Analysis(['run.py'],
             pathex=['D:\\sjy_repos\\ceshi'],
             binaries=[],
             datas=[('templates/index.html', 'templates'), ('static/style.css', 'static')],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             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)


-------------------------------------------

# 如果是项目用的 settings.py 文件 ,我也不想被打包怎么办?

# 很简单,打包的时候,把settings.py挪到其他地方去,别放在当前项目里,等打完包后,
# 再把该settings.py粘贴到  dist/_internal/目录下
# 这样改 dist/_internal/settings.py 里的配置内容,  然后重启run.py   也能起作用了!!! 


或者把配置文件内容不要写在settings.py,写到settings.json里面

run.spec配置文件改下
datas=[('settings.json','.')],

# 然后在启动文件里,读出该配置文件里面的数据, 去做赋值给对应的变量
# 还是改dist/_internal/ settings.json   然后保存后   重新启动run.py  新配置也能生效
# run.exe文件就不需要改了!!!

------------------------------------------------------

from gevent import monkey
monkey.patch_all()

import json
import os
from app_flask import app

from utils.uwsgi_server.server_gevent import *


if __name__ == "__main__":    # 读取平台基本配置

    if os.path.exists(file_path):
        with open('./settings.json','r',encoding='utf-8') as setting_file:
            settings_dict = json.load(setting_file)
            SYS_NAME = settings_dict['SYS_NAME']
            PORT = settings_dict['SERVICE_SERVER_PORT']
            print("配置文件读取正确")

    print(f'{SYS_NAME}[服务器模式]启动……')
    server = uwsgi_server(app=app,address='0.0.0.0',port=PORT)
    server.start()

    

打包后,运行.exe文件,报错说找不到setings文件等


# 有时候可能需要在启动文件里面加下面两行代码
import os, sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# print(os.path.dirname(os.path.abspath(__file__)))
# print(sys.path)


# 有些地方可能反射字符串的操作,会和打包操作起冲突!!!

# 建议在虚拟环境下打包文件,而且建议在pip里面只安装项目能启动所必须得模块,无关的不要装

deactivate
python38 -m virtualenv venv     # 根目录下创建venv虚拟环境文件夹
venv/scripts/activate
pip list


pyinstaller -D .\run.py    # 打包run.py文件


flask项目打包过程中,报错解决

# Invalid async_mode specified

python install gevent
python install gevent-websocket

在flask的执行入口文件(app.py)中引入gevent,引入即可
from engineio.async_drivers import gevent

---------------------------------------

from flask import Flask, render_template
from flask_socketio import SocketIO, send, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'
socketio = SocketIO(app, async_mode='gevent')

# async_mode=用的是啥gevent,点到对应的gevent源码里面,
# 看执行该功能的时候,导入的是什么模块,可能需要提前在flask的执行入口文件中引入要需要的模块
# 应该就可以了!!!

标签:指南,文件,run,settings,python,py,__,打包
From: https://www.cnblogs.com/tengyifan888/p/18530689

相关文章

  • DevOps业务价值流构建指南:以项目立项为起点
    一、前言业务价值流,作为公司运营的核心驱动力,其独特性源于每家公司的运营模式与工作流程的差异。尽管无法直接套用其他公司的业务流程,但我们可以从中汲取灵感与见解。正是这份独特性,让许多人在撰写业务价值流时感到挑战重重,然而,这恰恰凸显了其重要性。一个体系化、可执行的业......
  • 第十三届蓝桥杯Python 大学 B 组 数位排序
    数位排序问题描述小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022排在409前面,因为2022的数位之和是6,小于409的数位之和13。又如,......
  • 蓝桥杯【第13届省赛】Python B组 C题
    C:纸张尺寸【问题描述】    在ISO国际标准中定义了A0纸张的大小为1189mm×841mm,将A0纸沿长边对折后为A1纸,大小为841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将A1纸沿长边对折后为A2纸,依此类推。     输入纸张的名称......
  • 1.python的基本语法和简单数据类型
    1.1语法特点1.1.1注释语句单行注释在所需注释内容前加'#'号#我是一个注释多行注释'''(单引号/或双引号)注释代码''''''我是代码我是代码我是代码我是代码'''1.2.1缩进先看代码if<我是条件1>:<我是代码><我是代码>else:<我是......
  • 纯基础,新手小白也能学会:python的循环,循环控制以及图形输出(矩形,三角形,九九乘法表)
    python循环1.python的循环2.python循环控制3.图形输出1.矩形2.平行四边形3.直角三角形4.等腰直角三角形5.打印九九乘法表1.python的循环循环三要素:循环变量初始化循环条件改变循环变量i=1#循环变量初始化whilei<=5:print(f'跑到了第{i}圈')i......
  • python webdriver-manager 实现selenium 免下载安装webdriver
    selenium在自动化测试中,通常需要使用浏览器驱动来与浏览器进行交互。然而,手动下载、安装、以及管理这些驱动非常麻烦,尤其是当驱动版本频繁更新时。为此,webdriver-manager库提供了一个极简的方案,自动帮我们下载、更新和管理驱动,使Selenium代码更简洁优雅。webdriver-managergit......
  • 安卓端和鸿蒙性能测试环境脚本-sh+python
    背景:做安卓和鸿蒙性能测试,需要搭建环境,把常用的几个pip包和虚拟环境等记录一下,在新的电脑上可以快速安装(仅作为个人记录)准备工作mac电脑python版本>=3.7.9sh脚本#!/usr/local/bin/bash##########################################################################Fil......
  • 鸿蒙开发进阶(HarmonyOS )FileUri开发指南(C/C++)
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)场景介......
  • Java 日期时间处理指南
    技术博客:Java日期时间处理指南在现代Java编程中,处理日期和时间是一个常见且重要的任务。Java提供了多种日期时间类和工具,帮助开发者高效地处理各种日期时间操作。本文将详细介绍Java中的日期时间类、计算时间间隔、时区处理、日期格式化和解析、日期时间计算、日期时间比较......
  • Air780E的I2C软件使用指南
    ​ 今天我们学习合宙低功耗4G模组Air780E的I2C接口操作方法,文末【阅读原文】获取最新资料。一、I2C概述Air780E可支持1路I2C接口,如果复用的话最多有两路: ​I2C配置:兼容PhilipsI2C标准协议。支持Fastmode(400Kbps)和Slowmode(100Kbps)。只支持master模式,不支持slaver模式......