0%

Django 项目打包可执行文件

Django 项目打包可执行文件

坑 1:Django 依赖项

pyinstaller

还有用py2app的,放弃了
https://github.com/kevinlondon/django-py2app-demo

坑 2:pandas 依赖项

并且解决了引用了肥大无用的 mkl 动态库。

总结如下

1
2
3
4
5
6
7
conda create -n exe python=3
activate exe
conda install -c conda-forge pandas
pip install pyinstaller
pip isntall -r requirements.txt
pyi-makespec -D manage.py -n WordReview_D
pyinstaller --clean --noconfirm WordReview_D.spec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['manage.py'],
pathex=['/Users/benature/Documents/Coding/Web/TG_word'],
binaries=[],
datas=[
('/Users/benature/Documents/Coding/Web/TG_word/static','staticsfile'),
('/Users/benature/Documents/Coding/Web/TG_word/templates', 'templates'),
('/Users/benature/Documents/Coding/Web/TG_word/apps', 'apps'),
#('/Users/benature/Documents/Coding/Web/TG_word/pypi/pypugjs', 'pypugjs'),

],
hiddenimports=[
'pkg_resources.py2_warn',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sass_processor',
'sass_processor.apps',
'sass_processor.finders',
'pypugjs',
'pypugjs.ext.django',
'pypugjs.ext.django.templatetags',
'pandas.read_excel',
'dateutil',
'six',
'xlrd',
],
hookspath=[],
runtime_hooks=[],
excludes=[
'pymysql',
'mysqlclient',
],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)

def get_pandas_path():
import pandas
pandas_path = pandas.__path__[0]
return pandas_path
dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"])
a.datas += dict_tree
a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)

pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)

Key = ['mkl','libopenblas']
#Key = ['mkl', 'libopenblas', 'liblapack', 'libblas', 'libcblas']
def remove_from_list(input, keys):
outlist = []
for item in input:
name, _, _ = item
flag = 0
for key_word in keys:
if name.find(key_word) > -1:
flag = 1
if flag != 1:
outlist.append(item)
return outlist
a.binaries = remove_from_list(a.binaries, Key)

exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='WordReview_D',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='WordReview_D')

附注:执行 migrate 后可以删除libblas.3.dylib, libcblas.3.dylib, liblapack.3.dylib。大概率不影响正常使用。