天天看點

windows下python2.7安裝grpc

公司有個項目需要在windows環境下,使用python2.7的grpc!

在網上沒看見任何有用的資訊!隻能自己弄,還好,公司大牛甯工,已經幫我做了很多工作了!!

現在就如正題:grpc可以在git上下載下傳下來。不過這個“vsprojects” 需要用自己vs打開 需要編譯出來Release的庫

,“Release”檔案夾中最重要的一個檔案"grpc_dll.dll",後面編譯python的grpc時需要用的

打開cmd

你可以看見grpc根目錄有個setup.py,看見這個就說明可以直接用“python  setup.py build”

但是你執行上面指令之前需要,需要安裝依賴的第三方包,就在requirements.txt,裡面

直接執行“pip install -r requirements.txt”就自動安裝了!!

當你執行python setup.py build,會出錯!

提示

pip install -rrequirements.txt 

GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install

第一個好了解,我們都做過了

第二個就是需要設定一下環境變量 “set GRPC_PYTHON_BUILD_WITH_CYTHON=1”

在執行 python setup.py build ,發現報錯!!

提示說看見其中錯誤“not found stdbool.h”  ,最後提示“Microsoft Visual C++ 9.0 is required”!

“Microsoft Visual C++ 9.0 is required” 這個就是需要依賴vs2008才能編譯,但是我試了,還是會報錯“not found stdbool.h"

最後我發現,”stdbool.h“隻有vs2015才有,是以,我就把 vs2008的環境變量”VS90COMNTOOLS“ 的值,改成了 vs2015的路徑”C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\“

windows下python2.7安裝grpc

然後然後,在重新打開cmd,

grpc根目錄下執行 "python setup.py build",發現沒問題

接着”python setup.py install“, 成功了!!

我高興死了,進入python,

import grpc 你會發現報錯 "_windows/grpc_c.60.python"

但是這個時候你去python的Lib->site-packages下面是沒有grpc這個package的!

其實grpc的包是裡另一種egg的形式存在的就是這個檔案”grpcio-0.16.0.dev0-py2.7-win32.egg”

你可以把egg改成zip,就看建了裡面有個grpc的檔案夾,考出來,放到site-packages下面,把“grpcio-0.16.0.dev0-py2.7-win32.egg”删

退出python

再重新進入python ,

>> import grpc,還是報錯

根據報錯提示我找到了在源碼下面”cygrpc.pyx“這個檔案,發現這段代碼

if 'win32' in sys.platform:
    filename = pkg_resources.resource_filename(
        'grpc._cython', '_windows/grpc_c.64.python')
    if not isinstance(filename, bytes):
      filename = filename.encode()
    if not pygrpc_load_core(filename):
      raise ImportError('failed to load core gRPC library')
           

這個意思你沒有grpc_c.64.python這個檔案,這個檔案什麼?

最後大神甯工,說是release編譯出來的grpc_dll.dll,隻不過要重命名一下就行了!!

要在上面拷貝出來的grpc的目錄下面找_cython檔案夾,在這個檔案夾下建立"_windows"目錄,将grpc_dll.dll拷貝過來,重命名grpc_c.64.python,

退出python,重新進入python

>>import grpc  如果你的python是64位的,則import成功,如果你的python是32位的,就會報錯'failed to load core gRPC library',

這個是因為如果你的python是32位的,grpc,加載的會是grpc_c.32.python,是以,你隻需要把“grpc_c.64.python”重命名成“grpc_c.32.python”就行了;

這是因為

if not pygrpc_load_core(filename):
      raise ImportError('failed to load core gRPC library')
           

pygrpc_load_core()函數中會檢測一下你的python,如果是32位的會自動替換64為32,是以為報錯

int pygrpc_load_core(char *path) {
  HMODULE grpc_c;
#ifdef GPR_ARCH_32
  /* Close your eyes for a moment, it'll all be over soon. */
  char *six = strrchr(path, '6');
  *six++ = '3';
  *six = '2';
#endif
  grpc_c = LoadLibraryA(path);
  if (grpc_c) {
    pygrpc_load_imports(grpc_c);
    return 1;
  }

  return 0;
}
           

以上就是全部問題。

重新進入python >>import grpc  >> 成功了