热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码

Nuitka,100%兼容标准python2python3,静态编译你的python程序1.概述Nuitka(nuitka.net&#

Nuitka,100%兼容标准python2/python3,静态编译你的python程序

1. 概述

Nuitka(nuitka.net)可以将python代码转换为C++,然后编译为可执行文件,其通过直接调用python的api的方式实现从解析语言到编译语言的转换,并且在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容,作者宣称100%通过了python的测试用例,作者也宣称可以加速python代码0%~258%。

对比于cx_freeze/py2exe等打包工具,Nuitka则是完全的编译工具,编译后的可执行文件已经不需要字节码解释了,从这点看,已经很像VB6程序依赖于msvbvm60.dll一样了,都是调用dll内的api实现各种功能。

并且nuitka相比cython更帅气的一点是:享受编译福利的同时,你不需要和动态行为说再见。

2. 安装

首先到官网上根据你的python版本下载对应的nuitka安装包,直接执行安装即可,如果安装完成后系统环境变量中没有nuitka安装目录,建议添加。

其次要实现编译,得需要一个编译环境,在windows环境下可以安装微软的VS套件(至少是VS2012,VC6是编译不过的),或者按照MinGW(推荐,小巧,编译速度比VS快)。

安装完编译环境后,要将其bin目录添加到系统的环境变量,以便nuitka调用。

3.编译

直接调用

nuitka –exe yourmodule.py

则编译生成yourmodule.exe,试一下直接执行吧。

如果要完全脱离python环境,可以使用命令行

nuitka –exe –recurse-all –standalone –mingw –icon=app_icon.ico yourmodule.py

则会将所有依赖的包全部编译然后链接成一个单一的exe文件(依赖的pyd和dll无法链接,会拷贝到目标文件夹)

编译过程很慢,要有耐心!而且目标文件会比较大,要有心理准备。

一般情况下Nuitka生成的exe会比cx_freeze等打包后的exe要大不少,不过现在的计算机不用在乎这一点大小了吧。

4.nuitka的一些问题

尽管nuitka已经很稳定了,但是软件都是有bug的,我这里就列出几个我遇到的

1.python3+pyqt无法脱离python使用

此问题是nuitka不够智能,没有将pyqt所有的依赖都拷贝到目标文件夹所致,所以你要手工拷贝如下文件或目录:

sip.pyd,libEGL.dll,plugins\imageformats\,plugins\platforms\

2.dll/pyd过多

nuitka会将所有依赖的dll都拷贝到目标文件夹,而不管是否是系统标准dll,这样导致目标文件夹很多dll文件,所以编译完成后你可以手动删除这些dll,可能还有一些pyd文件是程序不需要的,也可以删除。

3.无法方便获取当前运行目录

打包工具都会将sys.executable设置为当前执行文件,但是nuitka为了100%和python兼容,没有设置此值,而__file__没有目录信息,所以需要调用操作系统api来获取了,我这里封装了一个简单的函数:

def getModuleFilePath():

#在使用nuitka编译后获取当前运行目录,当前仅工作于windows

import ctypes

try:

GetModuleFileName = ctypes.windll.kernel32.GetModuleFileNameA

except:

return os.path.dirname(os.path.realpath(__file__))

szPath = ctypes.create_string_buffer(b’\x00′*2048)

GetModuleFileName.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int]

GetModuleFileName(0, szPath, 2048)

return os.path.dirname(str(szPath.value))

5.结论

我也是经过了一段时间的观望和测试才决定使用nuitka的。

评测结果:通过所有测试用例,可执行文件很大(十多兆),内存占用和打包工具打包后的exe基本一样,效率提升一点点,没有源代码泄漏的担心。

从一段时间的实际使用和测试来看,完全可以部署于生产环境。

当然如果你对文件大小比较敏感并且不在意源代码泄漏的话(pyc很容易被反编译),建议使用打包工具代替。

转载自:http://bbs.chinaunix.net/thread-4151005-1-1.html


推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
author-avatar
377926138_b741aa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有