加载中...

Python编译


Python编译

compileall模块(编译pyc文件)

前提说明:这种方式并不能加密源码,是会被破解查看源码的!!!

如果只是为了加密,可以通过py2exe、pyinstaller或者cx_Freeze对Python程序进行打包。

compileall 模块是 Python 内置的一个模块,用于编译 Python 源代码文件以提高加载和运行速度。 具体可以查看官方文档,或者执行python3 -m compileall --help 命令来查看帮助文档。下面写一个编译例子:

首先我有如下格式文件:

[root@head test]# tree
.
├── commands
│   └── slurm_request.py
└── main.py

常用的编译方式:

  • 优化模式编译:

    优化模式编译:在默认情况下,Python 使用优化模式进行编译。在这种模式下,Python 解释器会尝试在生成的字节码文件中应用各种优化,以提高程序的执行性能。这些优化包括删除未使用的变量、常量折叠、短路条件判断等。优化模式编译是 Python 的默认行为,你不需要显式地指定任何选项来启用它。

    [root@head test]# python3 -m compileall ./
    Listing './'...
    Listing './commands'...
    Compiling './commands/slurm_request.py'...
    Compiling './main.py'...
    [root@head test]# tree
    .
    ├── commands
    │   ├── __pycache__
    │   │   └── slurm_request.cpython-36.pyc
    │   └── slurm_request.py
    ├── main.py
    └── __pycache__
        └── main.cpython-36.pyc
    
    3 directories, 4 files
  • 上面的方式尽管产生了编译文件,但是这些文件与源代码不在同一目录可能会带来调用问题。因此常常使用如下方式产生同级目录下的.pyc文件:

    -b 标志:当你使用 -b 标志时,compileall 模块会以二进制模式进行编译。在这种模式下,编译生成的字节码文件不会应用任何优化,而是保留了源代码中的所有细节和结构。这样做的目的是为了保持字节码文件与源代码的一致性,以便于调试和分析。

    [root@head test]# python3 -m compileall -b ./
    Listing './'...
    Listing './commands'...
    Compiling './commands/slurm_request.py'...
    Compiling './main.py'...
    [root@head test]# tree
    .
    ├── commands
    │   ├── slurm_request.py
    │   └── slurm_request.pyc
    ├── main.py
    └── main.pyc
    
    1 directory, 4 files

    加上-b参数就可以了,这种方式编译就与源文件一致了。

发布python程序过程

在实际发布程序时,可遵循如下几步:

  1. 编译生成pyc文件,建议增加-O优化项

    python3 -O -m compileall -b ./
  2. 删除py文件

    # 删除当前目录中所有以 .py 结尾的文件
    find . -type f -name "*.pyc" -exec rm {} +
  3. 删除__pycache__目录

    find . -type d -name "__pycache__" -exec rm -rf {} +
  4. 打包即可。

    打包教程点这里

此外还有**.pyd、.pyo**格式,具体差异可查看:

https://stackoverflow.com/questions/8822335/what-do-the-python-file-extensions-pyc-pyd-pyo-stand-for


文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录