公司有個項目需要在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\“
然後然後,在重新打開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 >> 成功了