25
25
26
26
$ cd project/src/
27
27
28
+ 示例脚本的下载地址
29
+
28
30
安装和注册 Pyarmor
29
31
==================
30
32
31
33
Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
32
34
33
35
$ pip install pyarmor.cli
34
36
35
- 因为重构功能需要能够解锁不可逆加密的许可证,所以必须购买相应的许可证并进行注册。例如::
36
-
37
- $ pyarmor reg pyarmor-regfile-5068.zip
38
-
39
- ...
40
-
41
- INFO Python 3.11.0
42
- INFO Pyarmor 9.1.0 (pro), 005068, btarmor
43
- INFO Platform darwin.x86_64
44
- INFO Current license information:
45
-
46
- License Type : pyarmor-pro
47
- License No. : pyarmor-vax-005068
48
- License To : Tester
49
- License Product : btarmor
37
+ 重构功能需要购买相应的许可证并进行注册
50
38
51
- BCC Mode : Yes
52
- RFT Mode : Yes
53
- CI/CD Mode : No
54
-
55
- Notes
56
- * Need verify license online when obfuscating scripts
39
+ 试用版和基础版许可证不包含重构功能,所以仅可以使用其中的部分功能
57
40
58
41
生成重构型脚本
59
42
==============
@@ -81,12 +64,27 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
81
64
重构复杂脚本
82
65
============
83
66
84
- 默认选项可以重构简单脚本,对于复杂脚本,重构之后脚本可能无法正确运行。例如::
67
+ 默认选项可以重构简单脚本,对于复杂脚本,重构之后脚本可能无法正确运行。
68
+
69
+ 例如,我们重新创建一个包含复杂脚本 `fibo.py ` 的新工程::
85
70
86
71
$ pyarmor init --clean -e fibo.py
72
+
73
+ 当使用下面的命令生成重构型脚本的时候,最后会出现如下警告::
74
+
87
75
$ pyarmor build --rft
76
+ ...
77
+ WARNING There are variables of unknown type
78
+ WARNING There are function calls which may use unknown arguments
79
+ WARNING Please check file ".pyarmor/project/rft_unknowns.json"
80
+ ...
81
+
82
+ 运行重构脚本会报错::
83
+
88
84
$ python dist/fibo.py
89
85
86
+ AttributeError: 'pyarmor__7' object has no attribute 'run'
87
+
90
88
这时候可以使用下面的命令自动生成额外的重构规则::
91
89
92
90
$ pyarmor build --autofix 1
@@ -99,6 +97,14 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
99
97
100
98
$ python dist/fibo.py
101
99
100
+ 使用上面的方法生成的重构规则会保留所有未知的属性,也就是说,如果不能确定某一个属性是否需要重命名,那么所有脚本中和该属性重名的名称都保留不变
101
+
102
+ 如果需要重命名所有类方法和属性,可以清除上面生成的规则::
103
+
104
+ $ pyarmor build --autofix 0
105
+
106
+ 然后根据需要人工配置重构规则,但是这需要学习和了解重构规则的使用方法,详细内容请参考后面高级重构功能
107
+
102
108
生成迷你型脚本
103
109
==============
104
110
@@ -165,18 +171,16 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
165
171
- 如果该名称是一个类,那么类的属性和方法,都不会进行重命名
166
172
- 如果该名称是一个函数,那么函数的参数也不会进行重命名
167
173
168
- 另外一种方式是使用配置选项 ` rft_exclude_names ` 输出类和函数等,这里面列出的类和函数也不会进行重命名 ::
174
+ 另外一种方式是直接指定需要输出类和函数 ::
169
175
170
- $ pyarmor env -p push rft_option:rft_exclude_names \
176
+ $ pyarmor env -p set rft_option:rft_auto_export tomjson.decoder:JSONDecoder
177
+ $ pyarmor env -p push rft_option:rft_auto_export \
171
178
tomjson:load tomjson:loads tomjson:dump tomjson:dumps
172
179
173
- 和 `` __all__ `` 输出方式相比较, ` rft_exclude_names ` 中的名称必须是模块内部定义的名称,而不能是导入的名称,例如::
180
+ 需要注意的是,` rft_auto_export ` 中的名称必须是模块内部定义的名称,而不能是导入的名称,例如::
174
181
175
182
# 错误,JSONDecoder 并没有在 tomjson/__init__.py 中被定义,只是被导入进来使用
176
- $ pyarmor env -p push rft_option:rft_exclude_names tomjson:JSONDecoder
177
-
178
- # 正确,JSONDecoder 是在 tomjson/decoder.py 中定义
179
- $ pyarmor env -p push rft_option:rft_exclude_names tomjson.decoder:JSONDecoder
183
+ $ pyarmor env -p set rft_option:rft_auto_export tomjson:JSONDecoder
180
184
181
185
然后重构整个包::
182
186
@@ -197,9 +201,11 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
197
201
198
202
$ pyarmor init --clean --src . --exclude fibo.py --exclude venv
199
203
200
- 不使用选项 :option: `--entry `, :option: `--module ` 以及 :option: `--package ` 来指定工程包含的脚本,模块和包的话,会自动搜索 :option: `--src ` 下面的文件和目录,把发现的模块和包自动增加到工程中
204
+ 该命令会自动搜索 :option: `--src ` 下面的文件和目录,把发现的模块和包自动增加到工程中
205
+
206
+ 查看工程包含的所有项目::
201
207
202
- 而一旦使用了任何一个选项指定了脚本,模块或者包,就不会进行自动搜索,只有指定的脚本,模块和包会添加到工程中
208
+ $ pyarmor build --list
203
209
204
210
重构整个工程::
205
211
@@ -209,8 +215,8 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
209
215
210
216
$ python dist/jsontool.py
211
217
212
- 解决重构的常见问题
213
- ==================
218
+ 高级重构功能
219
+ ============
214
220
215
221
对于复杂脚本,使用默认选项生成的重构型脚本,运行的时候主要会出现两种类型的问题
216
222
@@ -221,50 +227,20 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
221
227
222
228
AttributeError: 'pyarmor__7' object has no attribute 'run'
223
229
224
- 除了上文中提到的方法外,还可以使用下面的配置方法来解决
230
+ 除了上文中提到的自动生成重构规则的方法之外,还可以通过人工配置规则的方式来解决
225
231
226
232
属性名称不存在
227
233
--------------
228
234
229
- 如果提示属性名称 ``xxxx `` 不存在,可以增加规则 ,不重命名该属性::
235
+ 如果提示属性名称 ``xxxx `` 不存在,最简单的方式是直接增加排除规则 ,不重命名该属性::
230
236
231
237
$ pyarmor env -p set rft_option:rft_exclude_names xxxx
232
238
233
239
这样可以简化配置,但是可能造成更多的名称没有被重命名
234
240
235
- 函数参数名称不存在
236
- ------------------
237
-
238
- 如果错误提示是参数名称不存在,那么可以直接禁用重命名参数::
239
-
240
- $ pyarmor env -p set rft_option:rft_argument 0
241
+ 另外一种方式,是对出现问题的属性进行单独配置
241
242
242
- 或者也可以仅重命名 posonly 参数和 vararg 和 kwarg 参数::
243
-
244
- $ pyarmor env -p set rft_option:rft_argument 1
245
-
246
- 然后在重新加密脚本,这样可以简化配置,但是大部分参数可能没有被重命名
247
-
248
- 重构规则的使用示例
249
- ------------------
250
-
251
- 我们以脚本 `fibo.py ` 为例,首先创建仅包含该脚本的工程::
252
-
253
- $ pyarmor init --clean -m fibo.py
254
-
255
- 当使用下面的命令生成重构型脚本的时候,最后会出现如下警告::
256
-
257
- $ pyarmor build --rft
258
-
259
- WARNING There are variables of unknown type
260
- WARNING There are function calls which may use unknown arguments
261
- WARNING Please check file ".pyarmor/project/rft_unknowns.json"
262
-
263
- 第一个警告::
264
-
265
- WARNING There are variables of unknown type
266
-
267
- 是因为在脚本 `fibo.py ` 中,有如下的代码块:
243
+ 例如在脚本 `fibo.py ` 中,有如下的代码块:
268
244
269
245
.. code-block :: python
270
246
@@ -274,11 +250,9 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
274
250
obj.run()
275
251
return obj.result
276
252
277
- 因为参数 `obj ` 的类型不确定,所以默认情况是不会对其属性进行重命名,这样可能会导致问题。
278
-
279
- 解决方案有两种,
253
+ 因为参数 `obj ` 的类型不确定,所以默认情况是不会对其属性进行重命名,这样运行的时候会导致问题属性找不到的问题。
280
254
281
- 一是使用 annotation 指定变量类型,例如:
255
+ 一种解决方案是使用 annotation 指定变量类型,例如:
282
256
283
257
.. code-block :: python
284
258
@@ -288,19 +262,28 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
288
262
obj.run()
289
263
return obj.result
290
264
291
- 一是不修改脚本 ,使用规则指定变量类型。例如,执行下面的命令配置规则 ::
265
+ 另外一种解决方案是不修改脚本 ,使用规则指定变量类型。例如::
292
266
293
267
$ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj QuickFibo"
294
268
295
- 其中,后者特别适用于类型定义不在当前模块,而是在其他模块,例如 ::
269
+ 配置新规则之后,需要重新构建工程 ::
296
270
297
- $ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj foo:QuickFibo"
271
+ $ pyarmor build --rft
298
272
299
- 第二个警告::
273
+ 函数参数名称不存在
274
+ ------------------
300
275
301
- WARNING There are function calls which may use unknown arguments
276
+ 如果错误提示是参数名称不存在,那么可以直接禁用重命名参数::
277
+
278
+ $ pyarmor env -p set rft_option:rft_argument 0
302
279
303
- 是因为在脚本 `fibo.py ` 中,有如下的代码块:
280
+ 或者也可以仅重命名 posonly 参数和 vararg 和 kwarg 参数::
281
+
282
+ $ pyarmor env -p set rft_option:rft_argument 1
283
+
284
+ 这样可以简化配置,但是大部分参数可能没有被重命名
285
+
286
+ 另外一种方式是仅仅禁用某一个函数重命名参数,例如在脚本 `fibo.py ` 中,有如下的代码块:
304
287
305
288
.. code-block :: python
306
289
@@ -315,52 +298,11 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
315
298
316
299
调用函数 `show ` 的时候使用了参数 `kwarg ` ,而字典的键值重构之后不会改变,而函数的参数名称都进行了重命名,所以运行重构后的脚本会导致出现参数不存在错误
317
300
318
- 解决方案之一是配置函数 `show ` 的参数不能进行重命名,执行下面的命令进行配置::
319
-
320
- $ pyarmor env -p rft_option:rft_exclude_args fibo:show
321
-
322
- 配置好之后,在重新构建工程::
301
+ 使用下面的命令配置函数 `show ` 的参数不能进行重命名::
323
302
324
- $ pyarmor build --rft
325
- $ cat dist/fibo.py
326
- $ python dist/fibo.py
327
-
328
- 高级重构模式
329
- ------------
330
-
331
- 禁用自动重构模式以清除原来生成的规则::
332
-
333
- $ pyarmor build --autofix 0
334
-
335
- 并再次生成重构规则::
336
-
337
- $ pyarmor build --autofix 2
338
-
339
- 这条命令会自动生成一个配置文件 `.pyarmor/project/rft_autofix_rules.json `
340
-
341
- 这个配置里面包含了发生冲突的属性名称,需要人工修正配置
342
-
343
- 在上例中,它的内容如下:
303
+ $ pyarmor env -p set rft_option:rft_argument 3
304
+ $ pyarmor env -p push rft_option:rft_exclude_calls fibo:show
344
305
345
- .. code-block :: bash
346
-
347
- # The following variables type are unknown
348
- # Please replace "?" with variable type or "<any>"
349
- # "<any>" means not rename any attribute of this variable
350
- # pyarmor env -p rft_option:rft_attr_rules modname:scope:var.attr,*.?
351
-
352
- 如果某一个属性需要修改名称,那么,只需要把命令行前面的注释去掉,例如::
353
-
354
- pyarmor env -p rft_option:rft_attr_rules modname:scope:var.attr,*.?
355
-
356
- 最后重新生成加密脚本::
306
+ 配置修改之后,需要重新构建脚本::
357
307
358
308
$ pyarmor build --rft
359
-
360
- 查看加密脚本::
361
-
362
- $ cat dist/fibo.py
363
-
364
- 运行加密后的脚本::
365
-
366
- $ python dist/fibo.py
0 commit comments