当前位置:   article > 正文

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

nuitka 反编译

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  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
    
    • 1
  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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

在这里插入图片描述

常用参数

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

参考文章

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/694733
推荐阅读
相关标签
  

闽ICP备14008679号