Nuitka将Python源代码编译成可执行文件,注意的地方

Nuitka的GitHub地址
在Nuitka之前我们最常用的打包工具就是Pyinstaller了,但是经过反复考虑,我觉得Nuitka也还是很有必要了解记录一下,它可以直接将Python源码打包成dll库或者pyd文件,增加了反编译难度,不会暴露源码,遗憾的是Nuitka和Pyinstaller一样不支持交叉编译

Window下

  1. 第一步安装mingw64,在window上做过c语言开发的应该都知道这个东西这里就不做过多阐述了,记得将其安装的bin目录的路径加到环境变量啊
  2. 安装nuitka模块 pip install nuitka
  3. 我们的项目结果如下,其中taskSend.py为程序入口
│  all_scheduling_info.json
│  calculate_contract_code.json
│  logger.py
│  taskSend.py
│
├─.idea
│  │  .gitignore
│  │  misc.xml
│  │  modules.xml
│  │  taskAutomaticSend.iml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          profiles_settings.xml
│          Project_Default.xml
│
├─lib
│  │  __init__.py
│  │
│  ├─api
│  │  │  auth_rpc_api_pb2.py
│  │  │  auth_rpc_api_pb2_grpc.py
│  │  │  metadata_rpc_api_pb2.py
│  │  │  metadata_rpc_api_pb2_grpc.py
│  │  │  task_rpc_api_pb2.py
│  │  │  task_rpc_api_pb2_grpc.py
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          auth_rpc_api_pb2.cpython-37.pyc
│  │          auth_rpc_api_pb2_grpc.cpython-37.pyc
│  │          metadata_rpc_api_pb2.cpython-37.pyc
│  │          metadata_rpc_api_pb2_grpc.cpython-37.pyc
│  │          task_rpc_api_pb2.cpython-37.pyc
│  │          task_rpc_api_pb2_grpc.cpython-37.pyc
│  │
│  ├─common
│  │  │  base_pb2.py
│  │  │  base_pb2_grpc.py
│  │  │  data_pb2.py
│  │  │  data_pb2_grpc.py
│  │  │  __init__.py
│  │  │
│  │  └─__pycache__
│  │          base_pb2.cpython-37.pyc
│  │          data_pb2.cpython-37.pyc
│  │
│  └─types
│      │  header_pb2.py
│      │  header_pb2_grpc.py
│      │  identitydata_pb2.py
│      │  identitydata_pb2_grpc.py
│      │  messagehandler_pb2.py
│      │  messagehandler_pb2_grpc.py
│      │  metadata_pb2.py
│      │  metadata_pb2_grpc.py
│      │  resourcedata_pb2.py
│      │  resourcedata_pb2_grpc.py
│      │  taskdata_pb2.py
│      │  taskdata_pb2_grpc.py
│      │  types_pb2.py
│      │  types_pb2_grpc.py
│      │  __init__.py
│      │
│      └─__pycache__
│              identitydata_pb2.cpython-37.pyc
│              metadata_pb2.cpython-37.pyc
│              resourcedata_pb2.cpython-37.pyc
│              taskdata_pb2.cpython-37.pyc
│
├─log
│      task_interface.log
│
└─__pycache__
        logger.cpython-37.pyc

  1. 要注意的是打包的时候自定义的模块下面的__init__.py不能被误删,例如要导入lib.types时如果types文件夹下的__init__.py如若被删了,则lib.types会打包失败,至于__init__.py是啥东西,学过python的都知道,这里就不做过多阐述

  2. 我们开始执行打包命令

    nuitka --standalone --plugin-enable=pylint-warnings  --output-dir=output taskSend.py
    
  3. 打包结束后切换到taskSend.dist目录下可以看到存在了taskSend.exe,且目录结构如下,可以看到已经不存在任何python源文件了

    │  api-ms-win-core-console-l1-1-0.dll
    │  api-ms-win-core-datetime-l1-1-0.dll
    │  api-ms-win-core-debug-l1-1-0.dll
    │  api-ms-win-core-errorhandling-l1-1-0.dll
    │  api-ms-win-core-file-l1-1-0.dll
    │  api-ms-win-core-file-l1-2-0.dll
    │  api-ms-win-core-file-l2-1-0.dll
    │  api-ms-win-core-handle-l1-1-0.dll
    │  api-ms-win-core-heap-l1-1-0.dll
    │  api-ms-win-core-interlocked-l1-1-0.dll
    │  api-ms-win-core-libraryloader-l1-1-0.dll
    │  api-ms-win-core-localization-l1-2-0.dll
    │  api-ms-win-core-memory-l1-1-0.dll
    │  api-ms-win-core-namedpipe-l1-1-0.dll
    │  api-ms-win-core-processenvironment-l1-1-0.dll
    │  api-ms-win-core-processthreads-l1-1-0.dll
    │  api-ms-win-core-processthreads-l1-1-1.dll
    │  api-ms-win-core-profile-l1-1-0.dll
    │  api-ms-win-core-rtlsupport-l1-1-0.dll
    │  api-ms-win-core-string-l1-1-0.dll
    │  api-ms-win-core-synch-l1-1-0.dll
    │  api-ms-win-core-synch-l1-2-0.dll
    │  api-ms-win-core-sysinfo-l1-1-0.dll
    │  api-ms-win-core-timezone-l1-1-0.dll
    │  api-ms-win-core-util-l1-1-0.dll
    │  api-ms-win-crt-conio-l1-1-0.dll
    │  api-ms-win-crt-convert-l1-1-0.dll
    │  api-ms-win-crt-environment-l1-1-0.dll
    │  api-ms-win-crt-filesystem-l1-1-0.dll
    │  api-ms-win-crt-heap-l1-1-0.dll
    │  api-ms-win-crt-locale-l1-1-0.dll
    │  api-ms-win-crt-math-l1-1-0.dll
    │  api-ms-win-crt-process-l1-1-0.dll
    │  api-ms-win-crt-runtime-l1-1-0.dll
    │  api-ms-win-crt-stdio-l1-1-0.dll
    │  api-ms-win-crt-string-l1-1-0.dll
    │  api-ms-win-crt-time-l1-1-0.dll
    │  api-ms-win-crt-utility-l1-1-0.dll
    │  comctl32.dll
    │  dbghelp.dll
    │  libcrypto-1_1.dll
    │  libssl-1_1.dll
    │  pyexpat.pyd
    │  python37.dll
    │  select.pyd
    │  sqlite3.dll
    │  taskSend.exe
    │  tcl86t.dll
    │  tk86t.dll
    │  ucrtbase.dll
    │  unicodedata.pyd
    │  vcruntime140.dll
    │  _asyncio.pyd
    │  _bz2.pyd
    │  _ctypes.pyd
    │  _decimal.pyd
    │  _elementtree.pyd
    │  _hashlib.pyd
    │  _lzma.pyd
    │  _msi.pyd
    │  _multiprocessing.pyd
    │  _overlapped.pyd
    │  _queue.pyd
    │  _socket.pyd
    │  _sqlite3.pyd
    │  _ssl.pyd
    │  _tkinter.pyd
    │
    ├─google
    │  └─protobuf
    │      ├─internal
    │      │      _api_implementation.pyd
    │      │
    │      └─pyext
    │              _message.pyd
    │
    ├─grpc
    │  └─_cython
    │          cygrpc.pyd
    │
    ├─grpc_tools
    │      _protoc_compiler.pyd
    │
    ├─lib2to3
    │      Grammar3.7.8.final.0.pickle
    │      PatternGrammar3.7.8.final.0.pickle
    │
    └─log
            task_interface.log
    

Linux

和window类似,它编译后的taskSend.dist目录如下

.
├── _asyncio.so
├── audioop.so
├── _bz2.so
├── certifi
│   └── cacert.pem
├── _cffi_backend.so
├── _codecs_cn.so
├── _codecs_hk.so
├── _codecs_iso2022.so
├── _codecs_jp.so
├── _codecs_kr.so
├── _codecs_tw.so
├── cryptography
│   └── hazmat
│       └── bindings
│           ├── _constant_time.so
│           └── _openssl.so
├── _crypt.so
├── _csv.so
├── _ctypes.so
├── _curses_panel.so
├── _curses.so
├── _dbm.so
├── _decimal.so
├── _gdbm.so
├── google
│   └── protobuf
│       ├── internal
│       │   └── _api_implementation.so
│       └── pyext
│           └── _message.so
├── grpc
│   └── _cython
│       └── cygrpc.so
├── grpc_tools
│   └── _protoc_compiler.so
├── _hashlib.so
├── _json.so
├── libbz2.so.1.0
├── libcrypto.so.1.1
├── libdb-5.3.so
├── libexpat.so.1
├── libffi.so.6
├── libgcc_s.so.1
├── libgdbm.so.5
├── liblzma.so.5
├── libmpdec.so.2
├── libncursesw.so.5
├── libpanelw.so.5
├── libpython3.6m.so.1.0
├── libreadline.so.7
├── libsqlite3.so.0
├── libssl.so.1.1
├── libtinfo.so.5
├── libuuid.so.1
├── libz.so.1
├── log
│   └── task_interface.log
├── _lsprof.so
├── _lzma.so
├── markupsafe
│   └── _speedups.so
├── mmap.so
├── _multibytecodec.so
├── _multiprocessing.so
├── _opcode.so
├── readline.so
├── _sqlite3.so
├── _ssl.so
├── taskSend
└── termios.so

在这里插入图片描述

常用参数

–mingw64 #默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
–standalone 独立环境,这是必须的(否则拷给别人无法使用)
–output-dir=output 生成exe到out文件夹下面去
–show-progress 显示编译的进度,很直观
–show-memory 显示内存的占用
–plugin-enable=numpy --plugin-enable=tensorflow 如果项目用到了numpy和tensorflow,需要添加该参数,可以认为和科学计算、机器学习相关的库或许都要用该参数特殊指定

参考文章

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值