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

  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/zhangchao0515/p/12924615.html
Copyright © 2011-2022 走看看