Python導(dǎo)包、分包與打包的完整教程
第一部分:Python導(dǎo)包基礎(chǔ)(完全新手友好)
第一章:理解Python中的“包”和“模塊”
1.1 什么是模塊?
# 一個(gè).py文件就是一個(gè)模塊
# example.py 就是一個(gè)名為example的模塊
def say_hello():
print("你好!")
def add(a, b):
return a + b
1.2 什么是包?
# 包是一個(gè)包含__init__.py文件的文件夾
my_package/
__init__.py # 這個(gè)文件讓Python知道這是包
module1.py
module2.py
第二章:最簡(jiǎn)單的導(dǎo)包方式
2.1 同一個(gè)文件夾內(nèi)的導(dǎo)入
項(xiàng)目結(jié)構(gòu):
project/
main.py
utils.py
# utils.py
def greet(name):
return f"你好,{name}!"
def calculate_sum(numbers):
return sum(numbers)
# main.py - 方法1:導(dǎo)入整個(gè)模塊
import utils
result = utils.greet("小明")
print(result) # 輸出:你好,小明!
total = utils.calculate_sum([1, 2, 3, 4, 5])
print(total) # 輸出:15
# main.py - 方法2:導(dǎo)入特定功能
from utils import greet, calculate_sum
result = greet("小紅") # 直接使用,不用加 utils.
print(result)
# main.py - 方法3:導(dǎo)入并重命名
from utils import greet as say_hello
say_hello("小張") # 使用新名字
2.2 導(dǎo)入外部庫(kù)
# Python內(nèi)置庫(kù) import math import random import datetime # 第三方庫(kù)(需要先安裝) # pip install requests import requests
第三章:理解絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入
3.1 創(chuàng)建多級(jí)目錄結(jié)構(gòu)
my_project/
│ main.py
│
├───database/
│ │ __init__.py
│ │ connector.py
│ │ models.py
│
└───utils/
│ __init__.py
│ math_tools.py
│ string_tools.py
3.2 絕對(duì)導(dǎo)入(推薦新手使用)
# main.py from database.connector import connect_db from utils.math_tools import add_numbers from utils.string_tools import format_text
3.3 相對(duì)導(dǎo)入(在包內(nèi)部使用) 若直接運(yùn)行的是models.py
# 在 database/models.py 中 from .connector import connect_db # . 表示同一目錄 from ..utils.math_tools import add_numbers # .. 表示上級(jí)目錄
若直接運(yùn)行的是main.py
# 在 database/models.py 中 from database.connector import connect_db # 與main同一目錄 from utils.math_tools import add_numbers # 與main同一目錄
第四章:init.py 文件的妙用
4.1 最簡(jiǎn)單的 init.py
# database/__init__.py # 空文件也可以,但有它才算是包
4.2 有組織的 init.py
# utils/__init__.py # 集中導(dǎo)入,方便外部使用 from .math_tools import * from .string_tools import * # 或者更精確的控制 __all__ = ['add_numbers', 'multiply_numbers', 'format_text']
# 這樣在外面就可以 from utils import add_numbers # 不需要知道m(xù)ath_tools的存在
4.3 包級(jí)別的變量和初始化
# utils/__init__.py
# 包版本信息
__version__ = "1.0.0"
__author__ = "你的名字"
# 包初始化代碼
print("正在加載工具包...")
# 包級(jí)別的配置
DEFAULT_CONFIG = {
"log_level": "INFO",
"timeout": 30
}
第二部分:項(xiàng)目分包實(shí)踐(結(jié)構(gòu)化思維)
第五章:從小項(xiàng)目到中大型項(xiàng)目的演變
5.1 初級(jí)階段:扁平結(jié)構(gòu)
simple_app/
app.py # 主程序
config.py # 配置
helpers.py # 輔助函數(shù)
data.json # 數(shù)據(jù)文件
5.2 中級(jí)階段:按功能分包
medium_app/
│ main.py # 程序入口
│ requirements.txt # 依賴列表
│ README.md # 說(shuō)明文檔
│
├───core/ # 核心業(yè)務(wù)邏輯
│ │ __init__.py
│ │ calculator.py # 計(jì)算器類
│ │ validator.py # 驗(yàn)證器
│
├───ui/ # 用戶界面
│ │ __init__.py
│ │ window.py # 主窗口
│ │ widgets.py # 小部件
│
├───data/ # 數(shù)據(jù)處理
│ │ __init__.py
│ │ loader.py # 數(shù)據(jù)加載
│ │ saver.py # 數(shù)據(jù)保存
│
└───utils/ # 通用工具
│ __init__.py
│ logger.py # 日志工具
│ formatter.py # 格式化工具
5.3 專業(yè)階段:標(biāo)準(zhǔn)Python項(xiàng)目結(jié)構(gòu)
professional_app/ │ ├───src/ # 源代碼目錄(推薦結(jié)構(gòu)) │ └───my_app/ # 你的包名 │ │ __init__.py │ │ __main__.py # 命令行入口:python -m my_app │ │ cli.py # CLI接口 │ │ config.py # 配置管理 │ │ │ ├───core/ │ │ │ __init__.py │ │ │ business_logic.py │ │ │ models.py │ │ │ ├───api/ │ │ │ __init__.py │ │ │ routes.py │ │ │ handlers.py │ │ │ └───utils/ │ │ __init__.py │ │ helpers.py │ │ decorators.py │ ├───tests/ # 測(cè)試目錄 │ │ __init__.py │ │ test_core.py │ │ test_utils.py │ │ conftest.py # pytest配置 │ ├───docs/ # 文檔 │ index.md │ tutorial.md │ ├───examples/ # 示例代碼 │ basic_usage.py │ advanced_features.py │ ├───scripts/ # 腳本 │ setup_env.py │ generate_data.py │ │ .gitignore # Git忽略文件 │ pyproject.toml # 項(xiàng)目配置(現(xiàn)代方式) │ setup.py # 安裝配置(傳統(tǒng)方式) │ README.md # 項(xiàng)目說(shuō)明 │ LICENSE # 許可證 └───requirements.txt # 依賴包列表
第三部分:打包成可執(zhí)行文件(無(wú)需Python環(huán)境運(yùn)行)
第七章:為什么需要打包成exe?
7.1 打包的好處
- 用戶無(wú)需安裝Python
- 可以直接雙擊運(yùn)行
- 保護(hù)源代碼(可選)
- 方便分發(fā)
第八章:使用PyInstaller(最簡(jiǎn)單、最流行)
8.1 安裝PyInstaller
# 在命令行中執(zhí)行 pip install pyinstaller # 驗(yàn)證安裝 pyinstaller --version
8.2 基本打包命令
# 最簡(jiǎn)單的打包 pyinstaller your_program.py # 打包后,在 dist/ 文件夾中找到可執(zhí)行文件
8.3 常用參數(shù)詳解
# 1. --onefile:打包成單個(gè)文件 pyinstaller --onefile main.py # 2. --windowed:無(wú)控制臺(tái)窗口(適合GUI程序) pyinstaller --windowed gui_app.py # 3. --icon:設(shè)置圖標(biāo) pyinstaller --onefile --windowed --icon=my_icon.ico main.py # 4. --name:指定輸出文件名 pyinstaller --name "我的應(yīng)用" main.py # 5. --add-data:添加額外文件(如配置文件、圖片) # Windows格式:源文件路徑;目標(biāo)路徑 # Linux/Mac格式:源文件路徑:目標(biāo)路徑 pyinstaller --add-data "config.ini;." main.py pyinstaller --add-data "images/*.png:images" main.py # 6. --hidden-import:添加隱藏的依賴 pyinstaller --hidden-import=tkinter main.py
8.4 實(shí)戰(zhàn):打包一個(gè)圖形界面程序
# 假設(shè)你有一個(gè) tkinter 程序
pip install pyinstaller
# 進(jìn)入項(xiàng)目目錄
cd your_project_folder
# 打包命令
pyinstaller --onefile --windowed --icon=app.ico --name "我的應(yīng)用" ^
--add-data "images;images" ^
--add-data "config.ini;." ^
main.py
第九章:使用spec文件進(jìn)行高級(jí)控制
9.1 生成spec文件
# 生成初始spec文件 pyi-makespec main.py # 或者從已經(jīng)打包的項(xiàng)目中復(fù)制
9.2 spec文件詳解
# main.spec
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['main.py'], # 主程序文件
pathex=[], # 搜索路徑
binaries=[], # 二進(jìn)制文件
datas=[ # 數(shù)據(jù)文件
('config.ini', '.'),
('images/*.png', 'images'),
('sounds/*.wav', 'sounds')
],
hiddenimports=[ # 隱藏的依賴
'tkinter',
'PIL._tkinter_finder'
],
hookspath=[], # 鉤子路徑
hooksconfig={}, # 鉤子配置
runtime_hooks=[], # 運(yùn)行時(shí)鉤子
excludes=[], # 排除模塊(減少體積)
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None, # 加密字節(jié)碼
noarchive=False # 不打包成archive
)
# 打包成單個(gè)文件
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='我的應(yīng)用', # 輸出文件名
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True, # 使用UPX壓縮
console=False, # 顯示控制臺(tái)?True/False
icon='app.ico', # 圖標(biāo)
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='我的應(yīng)用' # 文件夾名稱
)
9.3 使用spec文件打包
# 使用spec文件打包 pyinstaller main.spec
第十章:使用cx_Freeze(跨平臺(tái)替代方案)
10.1 安裝和基本使用
pip install cx-Freeze
最佳實(shí)踐指南
- 使用src布局:將源代碼放在src目錄下
- 清晰的分層:按功能而不是按類型組織
- 最小化import:只導(dǎo)入需要的模塊
- 使用__init__.py控制導(dǎo)出:明確公開的API
- 虛擬環(huán)境:在干凈的虛擬環(huán)境中打包
- 測(cè)試打包結(jié)果:在另一臺(tái)干凈電腦上測(cè)試
- 版本控制:每次打包使用不同的版本號(hào)
- 簽名和加密:商業(yè)應(yīng)用考慮代碼簽名
以上就是Python導(dǎo)包、分包與打包的完整教程的詳細(xì)內(nèi)容,更多關(guān)于Python導(dǎo)包、分包與打包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python2中文處理紀(jì)要的實(shí)現(xiàn)方法
本篇文章主要介紹了Python2中文處理紀(jì)要的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法
今天小編就為大家分享一篇Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python爬取京東商品信息評(píng)論存并進(jìn)MySQL
這篇文章主要介紹了Python爬取京東商品信息評(píng)論存并進(jìn)MySQL,文章通過(guò)構(gòu)建mysql數(shù)據(jù)表展開Python爬取信息存進(jìn)MySQL的內(nèi)容,需要的小伙伴可以參考一下2022-04-04
一文帶你深入理解Python的`functools.lru_cache`裝飾器
Python中的functools.lru_cache裝飾器是一個(gè)非常有用的裝飾器,它可以幫助我們優(yōu)化遞歸函數(shù),避免重復(fù)計(jì)算已經(jīng)計(jì)算過(guò)的值,在這篇文章中,我們將探討?functools.lru_cache?的工作原理以及如何使用它,感興趣的朋友跟著小編一起來(lái)學(xué)習(xí)吧2023-07-07
Python統(tǒng)計(jì)文件中去重后uuid個(gè)數(shù)的方法
這篇文章主要介紹了Python統(tǒng)計(jì)文件中去重后uuid個(gè)數(shù)的方法,實(shí)例分析了Python正則匹配及字符串操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07
詳解Python if-elif-else知識(shí)點(diǎn)
本篇文章給大家總結(jié)了Python中if-elif-else的相關(guān)知識(shí)點(diǎn)以及語(yǔ)法相關(guān)內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。2018-06-06

