公司有个项目需要在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
>>
成功了