下面的问题没有出现在安装plyvel的过程中,但依旧分析一下,以后方便找到。
这个好像是在安装py-leveldb时遇到的问题:
Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
github/mhammond/pywin32
安装pywin32 错误提示3.6找不到注册表信息python version 3.6 required,which was not fount in the registry
依照要求完成了更新,但是仍然不行。
可能level.dll不是你python对应版本(当时是32位)的,我dll是64位的?我想应该就是这个问题。修改成对应版本的包即可。
如果你使用leveldb-py,这是一个leveldb的portable版的py库,可能会遇到下面问题(读取ethdb的时候,安装是没问题的,但是如果和我一样要求使用到ethereum上,那么还要去装plyvel(虽然最后还是没什么用就是了(苦笑))):
这是因为leveldb-py封装的leveldb的库太老了,因为历史原因leveldb的数据文件由.sst
变为了.ldb
.这个问题正如下面链接所说,其实将.ldb
改为.sst
即可。
LevelDB Corruption in npmd
但是这样对新的leveldb库来说,只能读取,不能写入。如果考虑使用leveldb-py,你需要考虑上面那些问题。
下面讲一讲plyvel的坑。
如果你使用pip install plyvel
,恐怕会遇到下面问题(时间太久了,记不太清):
这个意思是,pip能找到所有的版本都与你的系统不适应,所以你就无法安装了。如果你能找到一个plyvel.whl
当然更好,但是plyvel的作者并没有提供windows版本的whl,所以不行呢…只能另寻他路了。
考虑将源包下载下来,自己使用下面的命令:
python setup.py install
会出现下面的问题:
这个问题很显然,就是python.exe
找不到leveldb.lib
,自己编译一个即可(这个即可蕴含巨大工作量…)
省略一万字…(走了弯路)
这里有几个可能的获得leveldb.lib
的方法:
1.其他人编译好的lib文件,比如 https://github.com/happynear/py-leveldb-windows/ 的第三方库中的文件。那么根据plyvel官方文档的说法,你的leveldb.lib版本必须 > = 1.2.0 >=1.2.0 >=1.2.0,如果可行那么可行。
2.leveldb-master,也就是官方包(https://github.com/google/leveldb)。很可惜,这个是不能使用的。主要问题不是其他的,是因为这个安装包是给linux用的。如果你能够重新写一个与./util/env_posix.h
功能相同的文件,那么文件就能解决了。
3.leveldb-windows,可以编译,但是版本过老。
4.一位大牛提供的可在windows下编译的新版本leveldb https://github.com/vaskomitanov/leveldb 成功解决问题!
下面是leveldb-vaskomitanov的使用说明书:
必须是64位的(address-model=64),link必须为static,因为leveldb是lib(静态的)。runtime-link必须为shared,因为plyvel的库是动态的。必须编译为多线程(threading=multi),版本必须是release版的(release)。toolsets选一个能用的即可。
这里提供一个大致正确的安装过程:
windows下编译leveldb(已经验证)
再谈谈一些比较关键的操作:
1.检查代码生成中的运行库应该为/MD
。
2.编译的版本必须是64位release版。
3.env.posix.h
直接剔除即可,因为有env.win.h
提供函数。
4.预编译头中应该还有WIN32
供编译时识别。
1.setup.py的修改
先修改ext_modules:
ext_modules = [
Extension(
'plyvel._plyvel',
sources=['plyvel/_plyvel.cpp', 'plyvel/comparator.cpp'],
lib_dirs=['lib'],
libraries=['leveldb vaskomitanov-r x64',
'libboost_chrono-vc141-mt-x64-1_69',
'libboost_date_time-vc141-mt-x64-1_69',
'libboost_filesystem-vc141-mt-x64-1_69',
'libboost_system-vc141-mt-x64-1_69',
'libboost_thread-vc141-mt-x64-1_69'],
extra_compile_args=extra_compile_args,
)
]
注意引入lib库的名称要与你的lib文件一致。然后将lib文件放在python库中的libs
中即可。
在setup传参中加入一个:
include_dirs=["leveldb_include"]
leveldb_include
为你对应版本源包中提供的Include文件夹位置。
这样应该所有要注意的东西都到位了,如果还有什么不懂的可以留言问我。
参考:
Failed building wheel for xxx 解决办法
github/mhammond/pywin32
安装pywin32 错误提示3.6找不到注册表信息python version 3.6 required,which was not fount in the registry
Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
Error: ImportError: DLL load failed: %1 is not a valid Win32 application
ERROR:pycharm 出现 DLL load failed: %1 不是有效的 Win32 应用程序
LibSVM中错误:OSError: [WinError 193] %1 不是有效的 Win32 应用程序
LevelDB Corruption in npmd
Cannot open include file: ‘dirent.h’: No such file or directory
windows下编译leveldb(已经验证)
VS2017编译LevelDB
VS2013编译64位boost流程及若干问题
visual studio fatal error C1083: 无法打开源文件
VS 2017 生成dll、lib(动态链接库、静态链接库),并调用
windows下编译leveldb
在windows下配置pthread
windows下sqlite3静态库和动态库的编译
fatal error LNK1104: 无法打开文件“XXX".lib“
Windows注入与拦截(2) – 使用注册表方式完成DLL注入
【python基础知识】调用C++接口(setup.py运行)出现的各种问题
python的构建工具setup.py
C++工程编译之“error LNK2001: 无法解析的外部符号”
fatal error LNK1120: 12 个无法解析的外部命令
Error LNK2001 无法解析的外部符号 的几种情况及解决办法
link 和 runtime-link,搭配shared 和 static
Buidling boost error: Name clash for ‘
“No best alternative for libs/context/build/asm_sources” with armeabi-v7a architecture
boost学习笔记(windows+vs2017+boost1.67 64位编译)
编译并使用boost库(win7+boost1.63+vs2015+32位or 64位)
Windows上安装py-leveldb
cmake:vs2015/MinGW静态编译leveldb
Windows上面编译和简单测试一下leveldb-1.9.0
Windows Equivalent for sys/mman.h
github/witwall/mman-win32
python-packaging
Python Extension Patterns
pip install plyvel not working on Windows platform