Nuitka的GitHub地址
在Nuitka之前我们最常用的打包工具就是Pyinstaller了,但是经过反复考虑,我觉得Nuitka也还是很有必要了解记录一下,它可以直接将Python源码打包成dll库或者pyd文件,增加了反编译难度,不会暴露源码,遗憾的是Nuitka和Pyinstaller一样不支持交叉编译
Window下
- 第一步安装mingw64,在window上做过c语言开发的应该都知道这个东西这里就不做过多阐述了,记得将其安装的bin目录的路径加到环境变量啊
- 安装nuitka模块 pip install nuitka
- 我们的项目结果如下,其中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
-
要注意的是打包的时候自定义的模块下面的__init__.py不能被误删,例如要导入lib.types时如果types文件夹下的__init__.py如若被删了,则lib.types会打包失败,至于__init__.py是啥东西,学过python的都知道,这里就不做过多阐述
-
我们开始执行打包命令
nuitka --standalone --plugin-enable=pylint-warnings --output-dir=output taskSend.py
-
打包结束后切换到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,需要添加该参数,可以认为和科学计算、机器学习相关的库或许都要用该参数特殊指定