zoukankan      html  css  js  c++  java
  • Python-python打包编译成pyd或者.so,保护代码。

    2020-05-20

    参考:https://blog.csdn.net/qq_39852676/article/details/99842637

    https://blog.csdn.net/qq_39852676/article/details/99745224

    https://blog.csdn.net/kdongyi/article/details/102678595

    一、首先为什么要使用pyd文件?
            我们知道Python是一门解释型语言,当我们想让其他人运行我们的代码时,如果直接将.py源代码发送给他人,那么源代码将没有任何安全性可言,也就是任何一个人都可以打开源代码一看究竟,任何人都可以随意修改源代码。因此当我们想保护我们的源代码(算法保护)或者防止用户篡改源代码时,可以将Python源代码编译生成.pyd库文件或者.so库文件(Windows平台生成pyd文件,Linux生成so文件)。

    事实上,Python和Java的解释方式是相同的,只是我们表面上看Python是直接解释源代码,而实际上python解释器只会加载字节码。细心的小伙伴肯定发现了这一点,当我们import某个模块时,总是会在模块所在的目录创建一个__pycache__目录,里面存放着被加载模块的字节码文件。

    Python有以下几种类型的文件:

    • py:Python控制台程序的源代码文件
    • pyw:Python带用户界面的源代码文件
    • pyx:Python包源文件
    • pyc:Python字节码文件(可通过逆向编译来得到源码)
    • pyo:Python优化后的字节码文件(可通过逆向编译来得到源码)
    • pyd:在Windows平台上Python的库文件(Python版DLL)
    • so:在Linux平台上是so文件


    二、生成pyd/so库文件

    文件目录如下所示:

    代码(文件名py2c.py):

    from setuptools import setup
    # from distutils.core import setup
    from Cython.Build import cythonize
    
    setup(
        name='py2c',
        # 打包文件的名称,默认与py2c.py在同一路径下
        ext_modules=cythonize('mytest.py'),  
    )

    或者代码(文件名py2c_2.py):

    # -*- coding: utf-8 -*
    from distutils.core import setup
    from Cython.Build import cythonize
    
    def py2c(file):
        # 返回distutils.extension.Extension对象列表
        cpy = cythonize(file) 
    
        setup(
            name = 'pyd的编译', # 包名称
            version = "1.0", # 包版本号
            ext_modules= cpy, # 扩展模块
            author = "zc",#作者
            author_email='xxx@xxx.com' #作者邮箱
        )
    
    if __name__ == '__main__':
        file = "mytest.py"
        py2c(file)

    如何执行:

       在命令行执行如下代码:

    python py2c.py build_ext --inplace
    # 或者
    python py2c_2.py build_ext --inplace

    这两段代码生成的文件不太一样。

    在Windows平台执行结果:

    生成如下文件:

    在Linux平台执行结果:

    生成如下文件:

    第一个运行python py2c.py build_ext --inplace的结果

    第二个运行python py2c_2.py build_ext --inplace的结果

     具体如下:

     

    三、使用pyd/so库文件
     在命令行输入:

    python
    我用的是
    python3

    然后导入我们生成的库文件模块:

    import mytest
    mytest.main()
    mytest.test()

    注:mytest.main()  其中main()为mytest.py中的一个函数。

    结果:

    ————————————————
    版权声明:本文为CSDN博主「清晨的光明」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/kdongyi/article/details/102678595

  • 相关阅读:
    python操作pymysql
    使用raise语句抛出异常
    异常处理
    01.正太分布模型
    常用正则表达式总结(47条)
    Scrapy项目_苏宁图书信息
    Scrapy项目_阳光热线问政平台
    Scrapy 项目:腾讯招聘
    Python爬虫_糗事百科
    Python爬虫_百度贴吧(title、url、image_url)
  • 原文地址:https://www.cnblogs.com/zhangchao0515/p/12924615.html
Copyright © 2011-2022 走看看