python 转换成二进制文件可以再一定程度上起到加密作用, 封装成 whl 文件提供给用户方便安装。

1 转换

首先安装 cpython,

1
pip install cpython

文件夹如下所示,

1
2
3
4
5
6
7
8
9
10
your_project/

├── src/ # 包含代码和资源的目录
│ ├── your_module/ # 模块的目录
│ │ ├── __init__.py
│ │ ├── main_script.py # 引用PNG文件的代码
│ │ └── assets/ # 存放PNG文件的目录
│ │ └── image.png

└── setup.py # 用于打包的配置文件

编写 setup.py 文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from setuptools import setup, Extension
from Cython.Build import cythonize
import os

def find_py_files(package_name):
"""查找指定包下的所有 .py 文件"""
py_files = []
for root, _, files in os.walk(package_name):
for file in files:
if file.endswith(".py"):
py_files.append(os.path.join(root, file))
return py_files

package_name = "AAO"
py_files = find_py_files(package_name)

setup(
name=package_name,
ext_modules=cythonize(py_files, compiler_directives={'language_level': "3"}), # 编译为二进制
)

转换成二进制文件,执行命令,

1
python setup.py build_ext --inplace

删除文件夹中的 py 源码文件。

2 封包

首先安装 wheel 。

1
2
pip install wheel
python -m pip install wheel

文件夹如下所示,

1
2
3
4
5
6
7
8
9
10
your_project/

├── src/ # 包含代码和资源的目录
│ ├── your_module/ # 模块的目录
│ │ ├── __init__.py
│ │ ├── main_script.py # 引用PNG文件的代码
│ │ └── assets/ # 存放PNG文件的目录
│ │ └── image.png

└── setup.py # 用于打包的配置文件

setup.py 代码如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from setuptools import setup, find_packages

setup(
name="AAO", # 包名
version="0.1.0", # 版本号
description="Accelerated Automated Optimization Tool",
author="LDA",
packages=find_packages(),
install_requires=[ # 依赖的包
"pyautogui",
"numpy",
],
include_package_data=True, # 包含包中的非代码文件(如图片、文本等)
package_data={ # 指定需要包含的非代码文件
'AAO': ['images/gui_img/*.png', 'images/gui_img/*.ico', '*.pyd'],
},
)

执行以下命令封包,

1
python setup.py bdist_wheel

3 安装

安装包,执行,

1
2
pip install xx.whl
python -m pip install xx.whl

4 总结

二进制打包成 whl 文件时,会出先部分文件未打包,或者多打包的情况。

其中,文件多出现,删除编译生成的文件宠幸封包即可。

部分文件未打包需要确认 __init__.py 最好保留在包里,以及文件是否包含在 package_data 中。

⚓ Carl Zhao
🏢 逍遥科技有限公司
💭 曾经也是追光少年,然而少年归来已不再是少年,但依然在追光的路上。
📧 邮箱:1005513510@qq.com