重要

这里主要介绍的是 Pyarmor 9.1 中新增加的功能,原来的功能请参阅Pyarmor 9.0 文档

4.命令手册

4.1.pyarmor init

在当前目录创建工程,修改工程和显示工程信息

语法

[1] pyarmor init -h

[2] pyarmor init [-C] [-s PATH] [-x PATTERN] [-r]

[3] pyarmor init [-e FILE] [-m FILE] [-p PATH]

[4] pyarmor init

说明

[1]

显示命令帮助

[2]

创建工程,指定工程源路径,并把该路径下的模块和包增加到工程

[3]

增加指定的脚本,模块和包到工程

[4]

显示当前目录的工程信息

选项
-sPATH,--srcPATH

工程源路径,相对路径或者绝对路径,默认值是当前路径

-xPATTERN,--excludePATTERN

搜索工程源路径的时候排除匹配的文件或者目录,使用 fnmatch 的格式进行匹配

该选项可以使用多次,任何一个模式匹配的文件都会被排除在工程之外

模式可以包含通配符,匹配任意目录下面的文件或者目录名称,例如:

__pycache__config.pytest_*.pydata*

如果需要匹配指定包下面的文件和目录,使用包前缀模式,例如:

pkgname:test_*.pypkgname:config
-eFILE,--entryFILE

指定工程脚本,相对路径或者绝对路径的文件,可以使用多次指定多个脚本

如果是相对路径的话,总是相对于当前路径,例如:

$pyarmorinit--src../joker-e../joker/card.py

支持使用通配符,如果使用通配符的话,必须使用引号,例如:

$pyarmorinit--src../joker-e"../joker/*.py"

脚本是不会被工程中其他任何其他模块导入的模块

-mFILE,--moduleFILE

指定工程模块,相对路径或者绝对路径的文件,可以使用多次指定多个模块

相对路径和通配符的使用方法和-e 相同

-pPATH,--packagePATH

指定包所在的路径,相对路径或者绝对路径,可以使用多次指定多个包

相对路径和通配符的使用方法和-e 相同

包的默认名称是最后一级的路径名称,例如,添加包joker 到工程:

$pyarmorinit-plib/joker

如果包名称和路径名称不一致,使用后缀@pkgname 指定包名称,例如:

$pyarmorinit-plib/src@joker
-r,--recursive

搜索工程目录下面的模块和包的模式,没有指定该选项,则不会搜索工程目录

-C,--clean

在创建工程之前,清空原来的工程设置,创建一个空白工程

一般用于当前目录之前已经创建了工程,需要重新设置工程信息

用法

创建一个新的工程,增加当前路径下面的所有脚本和目录到工程中:

$pyarmorinit-r

需要把文件或者目录排除在工程之外,使用下面的方式:

$pyarmorinit--excludevenv--exclude"test*.py"

如果当前目录已经创建了工程,该命令也可以显示当前工程配置:

$pyarmorinit

查看工程中包含的所有脚本和模块:

$pyarmorbuild--list

重新创建工程,只包含一个脚本:

$pyarmorinit-C-efoo.py

使用-C ,会删除原来所有的工程设置,否则仅仅修改工程设置

创建工程之后,也可以使用命令pyarmor env 修改工程配置

示例

下面的所有示例中都假定当前目录还没有创建工程

  1. 创建一个工程,包含当前目录下面的所有脚本和所有子目录:

    $pyarmorinit-r
  2. 和上例类似,但是排除目录 venv 和所有 test 开头的脚本:

    $pyarmorinit-r--excludevenv--exclude"test*.py"
  3. 修改当前工程的路径,需要使用选项-C 清除原来的工程路径:

    $pyarmorinit-C--srcanother/src-r
  4. 创建一个工程,包含其他目录下面的所有脚本和目录:

    $pyarmorinit-seke/src-r
  5. 创建包含单独一个脚本的工程:

    $pyarmorinit-efoo.py
  6. 创建包含单独一个模块的工程:

    $pyarmorinit-mfibo.py
  7. 创建单独一个包 joker 的工程,包路径在当前目录下面的子目录joker:

    $pyarmorinit-pjoker
  8. 创建单独一个包 joker 的工程,包路径在当前目录下面的joker/src:

    $pyarmorinit-pjoker/src@joker
  9. 创建包含多个包的工程,在不同目录:

    $pyarmorinit-pmypkg-plib/mypkg1-plib/mypkg2
  10. 创建包含脚本,模块以及包的工程:

    $pyarmorinit-emain.py-mlib/*.py-plib/mypkg

4.2.pyarmor env

用于修改 Pyarmor 所有配置选项和工程设置

Pyarmor 的配置有三个域:

  • 全局域

  • 本地域

  • 工程域

每一个域都有若干节,每一节中有若干配置选项

对于相同的配置选项,其优先级是工程域 > 本地域 > 全局域

默认是本地域,所有选项和节请参考配置选项

语法

[5] pyarmor env -h

[6] pyarmor env [-l | -g | -p] info [NAME]

[7] pyarmor env [-l | -g | -p] get OPTION

[8] pyarmor env [-l | -g | -p] set OPTION VALUE

[9] pyarmor env [-l | -g | -p] reset OPTION

[10] pyarmor env [-l | -g | -p] [pop | push] OPTION VALUE ...

[11] pyarmor env [-l | -g | -p]

说明

[5]

显示命令帮助

[6]

显示可用选项和节,以及选项的使用用法

[7]

显示选项的值

[8]

设置选项的值

[9]

清除选项设置,恢复到默认值

[10]

增加或者删除列表选项中的一个或者多个值

[11]

进入交互命令模式

选项
-l,--local

查看和修改本地域的选项设置:

$pyarmorenv-l(local)ls
-g,--global

查看和修改全局域的选项设置:

$pyarmorenv-g(global)
-p,--project

查看和修改工程的选项设置:

$pyarmorenv-p(project)
info

显示可用的节和选项,当前选项的设置,以及选项的使用方法

例如,查看工程域的所有选项和节,以及选项的当前值:

$pyarmorenv-pinfoSections:rftOptions:src  scripts  modules  packages  excludes  recursive...

显示工程域中选项 excludes 的用法和当前设置:

$pyarmorenv-pinfoexcludes

显示工程域中的节 rft 中所有选项和选项的设置:

$pyarmorenv-pinforft

显示工程域中的节 rft 中选项 argument_mode 的设置和使用方法:

$pyarmorenv-pinforft:argument_mode
get

get 用于查看选项的值,例如:

$pyarmorenv-pgetexcludes

OPTION 也可以使用 SECTION:OPTION 的格式,例如:

$pyarmorenv-pgetrft:argument_mode
setreset

set 用于设置选项的值,reset 用于恢复选项的默认值,例如:

$pyarmorenv-psetrecursive1$pyarmorenv-psetrft:argument_mode0$pyarmorenv-presetrecursive$pyarmorenv-presetrft:argument_mode
pushpop

push 和 pop 用于修改列表型选项,增加或者删除一个或者多个值

例如向工程选项 excludes 中增加一个新的值:

$pyarmorenv-ppushexcludes"test*.py"

同时增加多个值:

$pyarmorenv-ppushexcludesvenvtest

如果值中包含空格,需要使用引号,例如:

$pyarmorenv-ppushexcludes"test 2""venv 2"

删除一个值:

$pyarmorenv-ppopexcludes"test*.py"
交互模式

直接执行命令而没有参数的话,会进入交互模式。例如:

$pyarmorenv-p(project)

输入? 然后在键入Enter ,显示所有可用的交互命令:

(project)?cd exit get help info ls pop push reset set use(project)
表-2. 交互命令表

命令

功能

示例

?

显示命令帮助

显示命令ls 的用法:

(project)? ls

use

切换不同的域

切换到全局域,然后切换回到工程域:

(project)use global(global)use project(project)

ls

列出当前可用的选项和节

查看工程域中的选项和节:

(project)lsSections:rftOptions:src  scripts  modules  packages  excludes  recursive

cd

切换到不同的组

进入到组 rft,然后在返回上一级:

(project)cd rft(project)[rft] cd ..(project)

get

显示选项的值

显示工程选项 scripts 的值和所有已经设置的工程选项值:

(project)get scriptsscripts              = hanoi.py(project)getsrc                  = /Users/zhaojunde/eksuite/srcscripts              = hanoi.py

set

设置选项的值

设置工程选项 src 的值:

(project)set src /Users/zhaojunde/eksuite/src

reset

恢复选项的默认值

清除工程选项 src 的值:

(project)reset src

push

增加一个值或者多个值到列表类型的选项

增加脚本foo.pyfibo.py 到工程脚本中:

(project)push scripts foo.py fibo.py(project)push scripts "foo.py" "fibo.py"

pop

从列表类型的选项中删除一个值或者多个值

从工程脚本中删除fibo.py:

(project)pop scripts fibo.py

info

显示节中的选项,或者选项的用法

显示工程域的所有选项和节:

(project)info

显示节rft 的所有选项:

(project)info rft

显示选项argument_mode 的使用方法:

(project)cd rft(project)[rft] info argument_mode

4.3.pyarmor build

加密工程中的所有脚本,生成相应类型的加密脚本

语法

[12] pyarmor build -h

[13] pyarmor build [--mini | --rft | --mini-rft]

[14] pyarmor build [--autofix {0,1,2,3}]

[15] pyarmor build [--randname {0,1}]

说明

[12]

显示命令帮助

[13]

加密工程中所有脚本

[14]

启用或者禁用自动重构模式

[15]

启用随机名称重命名脚本

--mini

构建工程,工程中的所有脚本都生成相应的迷你型加密脚本:

$pyarmorbuild--mini
--rft

构建工程,工程中的所有脚本都生成相应的重构型加密脚本:

$pyarmorbuild--rft
--mini-rft

构建工程,工程中的所有脚本首先进行重构,然后在生成相应的迷你型加密脚本:

$pyarmorbuild--mini-rft
--autofix{0,1,2,3}

该选项可自动生成重构规则,解决重构之后导致的脚本无法运行问题,共支持三种模式

  • 模式 1 使用最简单,一般不需要人工增加规则,但是可能很多属性都没有重命名

  • 模式 2 使用较为复杂的方式,大部分的属性都会重命名,但是有时候需要人工修改规则

  • 模式 3 使用最麻烦,但是能够重命名绝大部分属性,一般必须要人工修改规则

基本的使用步骤是

  1. 首先启动自动重构模式,生成规则。例如:

    $pyarmorbuild--autofix1
  2. 其次执行相应的构建命令:

    $pyarmorbuild--rft
  3. 然后运行重构后的脚本:

    $pythondist/foo.py
  1. 根据出现的问题修正规则文件.pyarmor/project/rft_autofix.rules

  2. 从第二步可以重新构建并执行,循环修正直到脚本运行没有问题

详细过程请参阅功能手册中的使用自动修正模式重构复杂脚本

如果不需要使用自动重构模式,那么使用下面的命令:

$pyarmorbuild--autofix0

然后在重新进行构建:

$pyarmorbuild--rft
--randname{0,1}

默认情况下,重构后脚本中的名称是固定前缀和顺序号,例如:

pyarmor__1 = 1pyarmor__2 = 'a'

如果启用随机名称,那么顺序号会替换成为随机名称,例如:

$pyarmorbuild--randname1$pyarmorbuild--rft$catdist/foo.pypyarmor20af2cdf6a = 1pyarmor5688af382c = 'a'

如果需要禁用随机名称,那么:

$pyarmorbuild--randname0

然后重构工程:

$pyarmorbuild--rft