@@ -81,153 +81,23 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
8181重构复杂脚本
8282============
8383
84- 对于简单脚本,使用默认选项可以正确重构脚本。但是对于复杂脚本,则需要额外的配置。
85-
86- 我们以脚本 `fibo.py ` 为例,首先创建仅包含该脚本的工程::
87-
88- $ pyarmor init --clean -m fibo.py
89-
90- 当使用下面的命令生成重构型脚本的时候,最后会出现如下警告::
91-
92- $ pyarmor build --rft
93-
94- WARNING There are variables of unknown type
95- WARNING There are function calls which may use unknown arguments
96- WARNING Please check file ".pyarmor/project/rft_unknowns.json"
97-
98- 第一个警告::
99-
100- WARNING There are variables of unknown type
101-
102- 是因为在脚本 `fibo.py ` 中,有如下的代码块:
103-
104- .. code-block :: python
105-
106- def fib (obj , n ):
107- obj.name = ' fibo'
108- obj.value = n
109- obj.run()
110- return obj.result
111-
112- 因为参数 `obj ` 的类型不确定,所以默认情况是不会对其属性进行重命名,这样可能会导致问题。
113-
114- 解决方案有两种,
115-
116- 一是使用 annotation 指定变量类型,例如:
117-
118- .. code-block :: python
119-
120- def fib (obj : QuickFibo, n ):
121- obj.name = ' fibo'
122- obj.value = n
123- obj.run()
124- return obj.result
125-
126- 一是不修改脚本,使用规则指定变量类型。例如,执行下面的命令配置规则::
127-
128- $ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj QuickFibo"
129-
130- 其中,后者特别适用于类型定义不在当前模块,而是在其他模块,例如::
131-
132- $ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj foo:QuickFibo"
133-
134- 第二个警告::
135-
136- WARNING There are function calls which may use unknown arguments
137-
138- 是因为在脚本 `fibo.py ` 中,有如下的代码块:
139-
140- .. code-block :: python
141-
142- def show (rlist , n , delta = 2 ):
143- print (' fibo' , n, ' is' , rlist)
144- return n + delta
145-
146- if __name__ == ' __main__' :
147- ...
148- kwarg = {' n' : n, ' delta' : 3 }
149- show(result, ** kwarg)
150-
151- 调用函数 `show ` 的时候使用了参数 `kwarg ` ,而字典的键值重构之后不会改变,而函数的参数名称都进行了重命名,所以运行重构后的脚本会导致出现参数不存在错误
152-
153- 解决方案之一是配置函数 `show ` 的参数不能进行重命名,执行下面的命令进行配置::
154-
155- $ pyarmor env -p rft_option:rft_exclude_args fibo:show
156-
157- 配置好之后,在重新构建工程::
84+ 默认选项可以重构简单脚本,对于复杂脚本,重构之后脚本可能无法正确运行。例如::
15885
86+ $ pyarmor init --clean -e fibo.py
15987 $ pyarmor build --rft
160- $ cat dist/fibo.py
16188 $ python dist/fibo.py
16289
163- 自动重构模式
164- ============
165-
166- 在上面的工程中,我们如果不想去进行额外的配置,可以使用自动重构模式
167-
168- 自动重构模式可以省去人工的配置,自动进行配置以生成正确的脚本。
169-
170- 首先使用下面的命令自动创建规则::
90+ 这时候可以使用下面的命令自动生成额外的重构规则::
17191
17292 $ pyarmor build --autofix 1
17393
174- 然后在执行相应的构建命令 ::
94+ 然后再次执行重构命令 ::
17595
176- $ pyarmor build --rft
177-
178- 其基本的工作原理是
179-
180- - 固定配置 rft_argument = 1
181- - 如果发现某一个属性无法确定其类型,那么这个属性不进行重命名
182-
183- 如果不需要使用自动重构模式,那么使用下面的命令::
184-
185- $ pyarmor build --autofix 0
186-
187- 然后在重新进行构建::
188-
189- $ pyarmor build --rft
190-
191- ..
192- 使用自动生成的配置脚本
193- ----------------------
194-
195- 在重构过程中会自动生成配置脚本 `.pyarmor/project/rft_extra_config.sh `
196-
197- 在上例中,它的内容如下:
198-
199- .. code-block :: bash
200-
201- # The following variables type are unknown
202- # Please replace "?" with variable type or "<any>"
203- # "<any>" means not rename any attribute of this variable
204- pyarmor env -p rft_option:var_type_table " fibo:fib.obj ?"
205-
206-
207- # The following function arguments could not be renamed
208- pyarmor env -p rft_option:rft_exclude_args fibo:show
209-
210- 这个脚本包含了解决两种警告所需要的额外配置,只需要替换 "?" 为变量的真实类型。
211-
212- 例如,修改第四行的内容为::
213-
214- pyarmor env -p rft_option:var_type_table "fibo:fib.obj QuickFibo"
215-
216- 然后直接运行配置脚本,就可以完成额外的配置::
217-
218- $ bash .pyarmor/project/rft_extra_config.sh
219-
220- 最后重新生成加密脚本::
221-
222- $ pyarmor build --rft
223-
224- 查看加密脚本::
225-
226- $ cat dist/fibo.py
96+ $ pyarmor build --rst
22797
228- 运行加密后的脚本 ::
98+ 运行重构后的脚本 ::
22999
230- $ python dist/fibo.py
100+ $ python dist/fibo.py
231101
232102生成迷你型脚本
233103==============
@@ -374,3 +244,123 @@ Pyarmor 发布在 PyPI 上面,使用下面的命令直接安装::
374244 $ pyarmor env -p set rft_option:rft_argument 1
375245
376246然后在重新加密脚本,这样可以简化配置,但是大部分参数可能没有被重命名
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 ` 中,有如下的代码块:
268+
269+ .. code-block :: python
270+
271+ def fib (obj , n ):
272+ obj.name = ' fibo'
273+ obj.value = n
274+ obj.run()
275+ return obj.result
276+
277+ 因为参数 `obj ` 的类型不确定,所以默认情况是不会对其属性进行重命名,这样可能会导致问题。
278+
279+ 解决方案有两种,
280+
281+ 一是使用 annotation 指定变量类型,例如:
282+
283+ .. code-block :: python
284+
285+ def fib (obj : QuickFibo, n ):
286+ obj.name = ' fibo'
287+ obj.value = n
288+ obj.run()
289+ return obj.result
290+
291+ 一是不修改脚本,使用规则指定变量类型。例如,执行下面的命令配置规则::
292+
293+ $ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj QuickFibo"
294+
295+ 其中,后者特别适用于类型定义不在当前模块,而是在其他模块,例如::
296+
297+ $ pyarmor env -p push rft_option:var_type_table "fibo:fib.obj foo:QuickFibo"
298+
299+ 第二个警告::
300+
301+ WARNING There are function calls which may use unknown arguments
302+
303+ 是因为在脚本 `fibo.py ` 中,有如下的代码块:
304+
305+ .. code-block :: python
306+
307+ def show (rlist , n , delta = 2 ):
308+ print (' fibo' , n, ' is' , rlist)
309+ return n + delta
310+
311+ if __name__ == ' __main__' :
312+ ...
313+ kwarg = {' n' : n, ' delta' : 3 }
314+ show(result, ** kwarg)
315+
316+ 调用函数 `show ` 的时候使用了参数 `kwarg ` ,而字典的键值重构之后不会改变,而函数的参数名称都进行了重命名,所以运行重构后的脚本会导致出现参数不存在错误
317+
318+ 解决方案之一是配置函数 `show ` 的参数不能进行重命名,执行下面的命令进行配置::
319+
320+ $ pyarmor env -p rft_option:rft_exclude_args fibo:show
321+
322+ 配置好之后,在重新构建工程::
323+
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+ 在上例中,它的内容如下:
344+
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+ 最后重新生成加密脚本::
357+
358+ $ pyarmor build --rft
359+
360+ 查看加密脚本::
361+
362+ $ cat dist/fibo.py
363+
364+ 运行加密后的脚本::
365+
366+ $ python dist/fibo.py
0 commit comments