Python生成.pyd文件,保护源码

转载链接:

https://www.cnblogs.com/GavinSimons/p/8359284.html

 

Python的脚本文件是开源的,量化策略的安全性没有保障。因此需要保护源码。那么要对Python代码进行混淆、加密保护。

混淆代码,我准备使用pyminifier。而加密处理,就比较麻烦。

Python有py、pyc、pyw、pyo、pyd等文件格式。

其中,pyc是二进制文件。但很容易被反编译。

pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。

pyo和pyc差不多,也容易被反编译。

最后剩下pyd格式。pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。该文件目前位置没找到可以被反编译的消息,只能被反汇编。Sublime text编辑器也是使用该格式。

 

Python的py文件生成pyd文件步骤如下。

 

1、安装Cython

可以使用pip命令安装Cython。

  1. pip install cython

2、处理vcvarsall.bat

若不处理,可能会出现“Unable to find vcvarsall.bat”错误。

安装Cython之后,还需要指定vcvarsall.bat的位置。

vcvarsall.bat是VC编译Python环境的文件之一。而vcvarsall.bat需要安装VC For Python2.7。我的Python是2.7,刚好可以使用这个。至于3.x版本不知道微软更新了没有。

下载地址:VCForPython27.msi

 

安装成功之后,再修改设置。让Cython可以找到vcarsall.bat。此处有两种方案。

方案1:修改Python安装目录的文件设置

方案2:修改注册表

 

我采用方案1,亲测可用。方案2未测试,看似可用。

 

3、创建工作目录并生成pyd文件

这里有一个坑。程序所在的目录路径不能包含中文文字。所以我在E盘下创建一个test文件夹,用于放置要处理的python文件。

简单写了一个测试文件(命名为test.py):

  1. #coding:utf-8
  2. def hello():
  3.     print("Hello world")
  4.     input("")

在该目录下,再新建一个py文件(命名为setup.py):

  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3.  
  4. setup(
  5.   name = 'Hello world app',
  6.   ext_modules = cythonize("test.py"),
  7. )

接着,再打开cmd,跳到该目录并执行如下命令:

  1. python setup.py build_ext --inplace

最终生成pyd文件

其中,build是生成过程使用到的临时文件。test.c也是临时文件,可以打开看看传说中的D语言代码。

test.pyd是我们所需的文件。

pyd文件可以像平常一样使用import引入模块的方式正常使用。

 

后来,我尝试使用py2exe打包pyd文件。还需要创建一个入口脚本(命名为index.py):

  1. import test
  2.  
  3. if __name__=="__main__":
  4.     test.hello()

为了方便打包,我重新创建一个目录。把index.py和test.pyd复制到该目录。

如何安装和使用py2exe这里我就不说了,自行百度一下。

分别用test.pyd和未处理的test.py打包效果如下:

1)用test.pyd

直接可以在index.exe对应的位置找到该文件。

 

2)用test.py

在该目录下没有test.py文件。该文件在library.zip中。

测试结果,用py2exe可以正常使用pyd文件。

 

ps:若用Cython出现如下错误,说明文件的编号和python脚本设置 #coding设置的编码不一致。保存一致编码即可解决该问题。

Decoding error, missing or incorrect coding= at top of source (cannot decode with encoding 'utf8': invalid start byte)

 

 

###############################################################

以下是安装vcpython27

转载链接:https://www.cnblogs.com/lazyboy/p/4017567.html

 

 

在windows平台上安装python c extension的扩展包是件很痛苦的事情,一般通过安装vc/vs系列来编译C扩展,不过安装包都比较大。或者通过mingw编译,不过有时会在兼容性上出现点问题。

有个好消息就是微软为Python提供了专用的编译器Microsoft Visual C++ Compiler for Python 2.7(包含32位和64位) 下载地址: http://aka.ms/vcpython27

提示:在此感谢@ThunderEX的提醒,setuptools 6.0及后续版本可以自动识别Microsoft Visual C++ Compiler for Python 2.7了,赶紧升级吧。如果不能升级,请参考下面的操作步骤。

1.下载完成并安装。以本机为例,安装完成后的路径为: 

1

C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0

2.修改python安装目录下Lib\distutils\msvc9compiler.py文件(如有必要可能msvccompiler.py文件也需要做相应更改,视系统而定),找到get_build_version方法直接return 9.0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

def get_build_version():

    """Return the version of MSVC that was used to build Python.

 

    For Python 2.3 and up, the version number is included in

    sys.version.  For earlier versions, assume the compiler is MSVC 6.

    """

    return 9.0

    prefix = "MSC v."

    i = sys.version.find(prefix)

    if i == -1:

        return 6

    i = i + len(prefix)

    s, rest = sys.version[i:].split(" ", 1)

    majorVersion = int(s[:-2]) - 6

    minorVersion = int(s[2:3]) / 10.0

    # I don't think paths are affected by minor version in version 6

    if majorVersion == 6:

        minorVersion = 0

    if majorVersion >= 6:

        return majorVersion + minorVersion

    # else we don't know what version of the compiler this is

    return None

然后再找到find_vcvarsall方法直接返回vcvarsall.bat的路径(以自己机器安装后的路径为准)

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

def find_vcvarsall(version):

    """Find the vcvarsall.bat file

 

    At first it tries to find the productdir of VS 2008 in the registry. If

    that fails it falls back to the VS90COMNTOOLS env var.

    """

    return r'C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat'

    vsbase = VS_BASE % version

    try:

        productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,

                                   "productdir")

    except KeyError:

        productdir = None

 

    # trying Express edition

    if productdir is None:

        vsbase = VSEXPRESS_BASE % version

        try:

            productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,

                                       "productdir")

        except KeyError:

            productdir = None

            log.debug("Unable to find productdir in registry")

 

    if not productdir or not os.path.isdir(productdir):

        toolskey = "VS%0.f0COMNTOOLS" % version

        toolsdir = os.environ.get(toolskey, None)

 

        if toolsdir and os.path.isdir(toolsdir):

            productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")

            productdir = os.path.abspath(productdir)

            if not os.path.isdir(productdir):

                log.debug("%s is not a valid directory" % productdir)

                return None

        else:

            log.debug("Env var %s is not set or invalid" % toolskey)

    if not productdir:

        log.debug("No productdir found")

        return None

    vcvarsall = os.path.join(productdir, "vcvarsall.bat")

    if os.path.isfile(vcvarsall):

        return vcvarsall

    log.debug("Unable to find vcvarsall.bat")

    return None

3.上述完成之后就可以在windwos下正常编译python的C扩展。以pycrypto-2.6.1为例,执行如下命令

1

python setup.py install

当然也可以建立一个windows的二进制包

1

python setup.py bdist_wininst

你可能感兴趣的:(3-python)