-
Notifications
You must be signed in to change notification settings - Fork 97
/
jamtoolsbuild.py
184 lines (176 loc) · 8.83 KB
/
jamtoolsbuild.py
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import time
jamfilelist = ["CoreModels", "jamcontroller", "WEBFilesTransmitter", "clientFilesTransmitter",
"jamscreenshot", "jampublic", "jamroll_screenshot", "Logger", "jamspeak",
"jamWidgets", "jam_transtalater","PaddleOCRModel/PaddleOCRModel"]
print("说明:main.py为存放引入库的文件(无需管),scr文件夹是fbs打包的项目目录.\n"
"运行本文件打包时,会自动解析所有jamfilelist中源码的引入库,"
"并将所有需要的库格式化后写入main.py文件中,从而让pyinstaller可以找到(否则可能有找不到库的错误)"
"同时会自动配置scr项目目录,然后通过命令行运行打包程序实现自动打包,如需生成安装文件Windows下需要nsis环境,请自行探索..\n"
"通过更改下面的WithCompile 和Debug变量可以调整是否编译和是否debug模式.\n"
"需要编译时会将所有源码文件编译为c然后编译为pyd文件,可以实现源码保护,而且运行速度略有提升,需要自行配置好c和cython环境\n"
"debug模式下运行打包文件将会有命令行窗口")
if __name__ == '__main__':
import os
import shutil
import subprocess, setuptools
from jampublic import PLATFORM_SYS
from CoreModels import VERSON
WithCompile = 0 # 是否编译
Debug = 0 # 是否debug模式
if WithCompile:
Compiler = subprocess.Popen('python setjam.py build_ext --inplace', shell=True,stderr=subprocess.PIPE)
Compiler.wait()
error=Compiler.stderr.read().decode("utf-8")
print(">>>>>{}\n><<<<<<".format(error))
if "error"in error:
raise Exception("Compiler fail!\n{}".format(error))
if PLATFORM_SYS == "win32":
ext = ".pyd"
suffix = ".cp37-win_amd64"
else:
ext = ".so"
suffix = ".cpython-37m-darwin"
else:
ext = ".py"
suffix = ""
if os.path.exists("src/main/python"):
print("清空目标文件夹")
shutil.rmtree("src/main/python")
time.sleep(0.1)
os.mkdir("src/main/python")
for file in jamfilelist:
if os.path.exists('{}{}{}'.format(file, suffix, ext)):
if "/" in file:
path = 'src/main/python/{}'.format("/".join(os.path.split(file)[:-1]))
if not os.path.exists(path):
print("创建文件夹{path}")
os.mkdir(path)
if os.path.exists('src/main/python/{}{}'.format(file, ext)):
os.remove('src/main/python/{}{}'.format(file, ext))
print('removed src/main/python/{}{}'.format(file, ext))
shutil.copy2('{}{}{}'.format(file, suffix, ext), 'src/main/python/{}{}'.format(file, ext))
if WithCompile:
os.remove("{}{}{}".format(file, suffix, ext))
print('copy {}{}'.format(file, ext))
else:
raise OSError('{}{}{} not found'.format(file, suffix, ext))
file_tips = "\n####### 本文件由jamtoolsbuild.py 打包脚本自动生成 ######\n\n"
with open('main.py', "w", encoding="utf-8") as mainf:
importfilelist = ["# !usr/bin/python3\n","# -*- coding: utf-8 -*-\n",
file_tips,"import pynput.keyboard\n", "import pynput.mouse\n"]
for file in jamfilelist:
print("explaining {}".format(file))
with open("{}.py".format(file), "r", encoding="utf-8") as soursef:
line = soursef.readline()
while line:
if line[:6] == "import" or (line[:4] == "from" and "import" in line):
if "PyQt5" in line or "pynput" in line:
if "from" in line:
line = "import " + line.split(" ")[1] + "\n"
elif " as " in line:
line = line.split(" as ")[0] + "\n"
if "jampublic" in line: line = "import jampublic\n"
while line[-2] == "\\": # 多行
if line not in importfilelist:
importfilelist.append(line)
line = soursef.readline()
if line not in importfilelist:
importfilelist.append(line)
line = soursef.readline()
mainf.writelines(importfilelist)
mainf.writelines(["from CoreModels import main\n", "main()\n\n",file_tips])
shutil.copy2('main.py', 'src/main/python/main.py')
print('copy main.py')
shutil.copy2('imagefiles/jamresourse.py', 'src/main/python/jamresourse.py')
print('copy jamresourse.py')
if os.path.exists("src/main/resources/base"):
shutil.rmtree("src/main/resources/base")
resource_pack_dict={
"dirs":{# from : to
"bin/" + PLATFORM_SYS:"src/main/resources/base/bin/"+ PLATFORM_SYS,
"html":"src/main/resources/base/html",
"site-packages/qt_material":"src/main/resources/base/qt_material",
"PaddleOCRModel/modelv3":"src/main/resources/base/PaddleOCRModel/modelv3"
},
"files":{# dir : files
"src/main/resources/base":["log.log", "LICENSE","fake_useragent_0.1.11.json"]+\
["screen-capture-recorder-x64.dll", "audio_sniffer-x64.dll"]if PLATFORM_SYS == "win32" else [] + ["libopencv_world.so.3.4"] if PLATFORM_SYS == "linux" else [],
"src/main/resources/base/PaddleOCRModel":["PaddleOCRModel/ppocr_keys_v1.txt"]
}
}
os.makedirs("src/main/resources/base/bin")
dirs = resource_pack_dict["dirs"]
print("打包资源目录")
for d in dirs:
td = dirs[d]
if os.path.exists(d):
rd = "/".join(os.path.split(td)[:-1])
if not os.path.exists(rd):
print(f"+创建目录:{rd}")
os.makedirs(rd)
if os.path.exists(td):
shutil.rmtree(td)
print(f"-移除{td}")
shutil.copytree(d, td)
print(":copy{} -> {}".format(d, td))
else:
print("!不存在源路径:", d)
files = resource_pack_dict["files"]
print("打包资源文件")
for td in files:
fileslist = files[td]
if not os.path.exists(td):
print(f"+创建目录:{td}")
os.makedirs(td)
for file in fileslist:
if os.path.exists(file):
filename = os.path.split(file)[-1]
to_dir_filename=os.path.join(td,filename)
if os.path.exists(to_dir_filename):
os.remove(to_dir_filename)
print("-移除", to_dir_filename)
shutil.copy2(file, to_dir_filename)
print(":copy{} -> {}".format(file, to_dir_filename))
else:
print(f"!找不到源文件{file}")
if PLATFORM_SYS == "win32" and os.path.exists("target/installer/Installer.nsi"):
"""重写windows下的nsis配置文件版本号"""
with open("target/installer/Installer.nsi", "r", encoding="ansi") as nsisfile:
ns = nsisfile.readlines()
for i, line in enumerate(ns):
if "!define PRODUCT_VERSION" in line:
print("找到版本号{}".format(line))
v = line.split('"')[-2]
print(v)
if v != VERSON:
print("版本号不同")
ns[i] = '!define PRODUCT_VERSION "{}"\n'.format(VERSON)
with open("target/installer/Installer.nsi", "w", encoding="ansi") as nsisfile:
nsisfile.writelines(ns)
break
print('start freeze')
# fbs freeze --debug
freezer = subprocess.Popen('fbs freeze {}'.format("--debug" if Debug else ""), shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
freezer.wait()
print("freeze end")
if PLATFORM_SYS != "win32":
a = input("是否打包为安装文件,Y/N:(回车默认Y)")
if "y" in a.lower() or len(a) == 0:
print("开始打包镜像")
freezer = subprocess.Popen('fbs installer', shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
freezer.wait()
print("打包完成")
if PLATFORM_SYS == "linux":
print("linux下自行运行sudo dpkg -i target/JamTools.deb安装")
else:# win32下打包好之后的操作
if os.path.exists("target/JamTools/cv2"):
print("replace cv2 module")
shutil.rmtree("target/JamTools/cv2")
os.mkdir("target/JamTools/cv2")
shutil.copy2("opencv_world341.dll", "target/JamTools/cv2/opencv_world341.dll")
shutil.copy2("cv2.cp37-win_amd64.pyd", "target/JamTools/cv2/cv2.cp37-win_amd64.pyd")
print('finished all')
time.sleep(2)