VNPY加密教程(Python生成pyd文件)

安裝成功以後,再修改設置。讓Cython能夠找到vcarsall.bat。此處有兩種方案。(我採用方案1,親測可用。方案2未測試,看似可用。)html

方案1:修改Python安裝目錄的文件設置python

windows平臺使用Microsoft Visual C++ Compiler for Python 2.7編譯python擴展
 

安裝Cython

可使用pip命令安裝Cython。windows

pip install cython

  

處理vcvarsall.bat

若不處理,可能會出現「Unable to find vcvarsall.bat」錯誤。app

在windows平臺上安裝python c extension的擴展包是件很痛苦的事情,通常經過安裝vc/vs系列來編譯C擴展,不過安裝包都比較大。或者經過mingw編譯,不過有時會在兼容性上出現點問題。編輯器

有個好消息就是微軟爲Python提供了專用的編譯器Microsoft Visual C++ Compiler for Python 2.7(包含32位和64位) 下載地址: http://aka.ms/vcpython27post

1.下載完成並安裝。以本機爲例,安裝完成後的路徑爲: 測試

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

2.修改python安裝目錄下Lib\distutils\msvc9compiler.py文件(若有必要可能msvccompiler.py文件也須要作相應更改,視系統而定),找到get_build_version方法直接return 9.0ui

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."
     =  sys.version.find(prefix)
     if  = =  - 1 :
         return  6
     =  +  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的路徑(以本身機器安裝後的路徑爲準)this

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\acer\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
 

方案2:修改註冊表

錯誤描述: 
在從源代碼安裝Python模塊時遇到此錯誤。但是我明明從官網下載並安裝了Microsoft Visual C++ Compiler Package for Python 2.7,且配置了環境變量path。

錯誤緣由: 
報這個錯誤的緣由是Python的distutils模塊中的msvc9compiler.py並不從環境變量指定的路徑中尋找’vcvarsall.bat’,而是經過註冊表來尋找…,然而,不知爲何編譯器安裝過程沒有配置註冊表。

解決辦法: 
只要手工把註冊表配置好,就能夠了。 
// 一、打開註冊表編輯器 
run regedit 
// 二、配置 
// 2.一、若是你安裝的Python是32位的,則,建立以下項: 
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Setup\VC 
// 2.二、若是你安裝的Python是64位的,則,建立以下項: 
HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VC 
// 三、並在此項下新建字符串值: 
名稱:productdir 
數據:vcvarsall.bat所在路徑 
注意:路徑中不包含最後的反斜槓。

  

 

三、建立工做目錄並生成pyd文件

這裏有一個坑。程序所在的目錄路徑不能包含中文文字。因此我在E盤下建立一個test文件夾,用於放置要處理的python文件。url

簡單寫了一個測試文件(命名爲test.py):

  1. #coding:utf-8
    def hello():
        print("Hello world")
        input("<press ENTER to quit>")
    

      

在該目錄下,再新建一個py文件(命名爲setup.py):

  1. from distutils.core import setup
    from Cython.Build import cythonize
     
    setup(
      name = 'Hello world app',
      ext_modules = cythonize("test.py"),
    )
    

      

       接着,再打開cmd,跳到該目錄並執行以下命令:

  1. python setup.py build_ext --inplace

 參考博客地址:http://yshblog.com/blog/117  ,https://blog.csdn.net/qq_34106574/article/details/81166062

相關文章
相關標籤/搜索