我以为成功安装python-steem库就可以愉快地玩耍了,这个想法还是太单纯,谁知道在导入steem模块的时候又出现问题了:无法导入winrandom模块。
1
2
3
4
| from steem import Steem
s = Steem()
balance = s.get_account('yjcps')['sbd_balance']
print(balance)
|
1
2
3
4
5
6
7
8
| i:\python364\lib\site-packages\Crypto\Random\OSRNG\nt.py in <module>()
26 __all__ = ['WindowsRNG']
27
---> 28 import winrandom
29 from .rng_base import BaseRNG
30
ModuleNotFoundError: No module named 'winrandom'
|
很自然地想到winrandom这个模块是不是没安装啊?拿出pip安装winrandom试试。
python -m pip install winrandom
在编译winrandom时又有新问题:ValueError: Unknown MS Compiler version 1900
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| ----------------------------------------
Failed building wheel for winrandom
Running setup.py clean for winrandom
Failed to build winrandom
Installing collected packages: winrandom
Running setup.py install for winrandom ... error
Complete output from command I:\PYTHON~1\python.exe -u -c "import setuptools, tokenize;__file__='K:\\temp\\pip-install-f7pz4ekx\\winrandom\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record K:\temp\pip-record-xtfsjesk\install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_ext
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "K:\temp\pip-install-f7pz4ekx\winrandom\setup.py", line 43, in <module>
ext_modules=[winrandom1])
...
self.dll_libraries = get_msvcr()
File "I:\PYTHON~1\lib\distutils\cygwinccompiler.py", line 95, in get_msvcr
raise ValueError("Unknown MS Compiler version %s " % msc_ver)
ValueError: Unknown MS Compiler version 1900
----------------------------------------
|
网上查到解决办法,修改I:\PYTHON~1\lib\distutils\cygwinccompiler.py文件,打补丁。
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
| def get_msvcr():
"""Include the appropriate MSVC runtime library if Python was built
with MSVC 7.0 or later.
"""
msc_pos = sys.version.find('MSC v.')
if msc_pos != -1:
msc_ver = sys.version[msc_pos+6:msc_pos+10]
if msc_ver == '1300':
# MSVC 7.0
return ['msvcr70']
...
elif msc_ver == '1600':
# VS2010 / MSVC 10.0
return ['msvcr100']
### PATCH###############################
# INCLUDES NEWEST mscvcr VERSION
#########################################
elif msc_ver == '1900':
# Visual Studio 2015 / Visual C++ 14.0
# "msvcr140.dll no longer exists" http://blogs.msdn.com/b/vcblog/archive/2014/06/03/visual-studio-14-ctp.aspx
return ['vcruntime140']
#########################################
else:
raise ValueError("Unknown MS Compiler version %s " % msc_ver)
|
再次尝试安装编译winrandom,还是失败:No such file or directory
这是找不到src/winrandom.c源文件吗?继续鼓捣鼓捣,感觉自己瞎折腾了一番,没解决问题,玩累了,再次到网上求助。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ----------------------------------------
Failed building wheel for winrandom
Running setup.py clean for winrandom
Failed to build winrandom
Installing collected packages: winrandom
Running setup.py install for winrandom ... error
Complete output from command I:\PYTHON~1\python.exe -u -c "import setuptools, tokenize;__file__='K:\\temp\\pip-install-g_5exyuk\\winrandom\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record K:\temp\pip-record-qp70g1vo\install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_ext
building 'winrandom' extension
creating build
creating build\temp.win32-3.6
creating build\temp.win32-3.6\Release
creating build\temp.win32-3.6\Release\src
I:\gcc\bin\gcc.exe -mdll -O -Wall -II:\PYTHON~1\include -II:\PYTHON~1\include -c src/winrandom.c -o build\temp.win32-3.6\Release\src\winrandom.o
gcc: error: CreateProcess: No such file or directory
error: command 'I:\\gcc\\bin\\gcc.exe' failed with exit status 1
----------------------------------------
|
网上别人给的解决办法:修改i:\python364\lib\site-packages\Crypto\Random\OSRNG\nt.py文件,将import winrandom 改成 from . import winrandom
方法有效。原来不是winrandom模块没有安装,而是Python的导入机制找不到模块的路径。先入为主地把思考问题的方向弄错了,花多少时间都是白费。Python的模块导入机制是如何搜索模块路径的?得花时间去了解一下。
1
2
| # import winrandom
from . import winrandom
|
尝试导入steem模块,又有新问题:OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| i:\python364\lib\site-packages\scrypt\scrypt.py in <module>()
13 __version__ = '0.8.6'
14
---> 15 _scrypt = cdll.LoadLibrary(imp.find_module('_scrypt')[1])
16
17 _scryptenc_buf = _scrypt.exp_scryptenc_buf
i:\python364\lib\ctypes\__init__.py in LoadLibrary(self, name)
424
425 def LoadLibrary(self, name):
--> 426 return self._dlltype(name)
427
428 cdll = LibraryLoader(CDLL)
i:\python364\lib\ctypes\__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
346
347 if handle is None:
--> 348 self._handle = _dlopen(self._name, mode)
349 else:
350 self._handle = handle
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
|
问题出现在加载"_scrypt"这个模块上,这个模块不是一个.py文件,而是一个编译好的动态库:"_scrypt.cp36-win32.pyd"。
为什么出现这个问题?
难道是混用了 32-bit 和 64-bit的程序?通过pip安装的,应该不会弄错版本,而且安装的时候会提示:XXX is not a supported wheel on this platform.
难道是"_scrypt.cp36-win32.pyd"这个程序损坏了?将scrypt模块卸载重装,问题依旧。没招了,不知道该怎么鼓捣了。
到了第二天,突然想了想,当前scrypt模块安装的是最新版:scrypt-0.8.6,要不装旧版本的试试,然后安装了scrypt-0.8.5。
1
2
3
4
5
6
7
8
9
10
11
12
13
| D:\Users\tracis>python -m pip uninstall scrypt
Uninstalling scrypt-0.8.6:
Would remove:
i:\python~1\lib\site-packages\_scrypt.cp36-win32.pyd
i:\python~1\lib\site-packages\scrypt-0.8.6.dist-info\*
i:\python~1\lib\site-packages\scrypt\*
Proceed (y/n)? y
Successfully uninstalled scrypt-0.8.6
D:\Users\tracis>python -m pip install K:\scrypt-0.8.5-cp36-cp36m-win32.whl
Processing k:\scrypt-0.8.5-cp36-cp36m-win32.whl
Installing collected packages: scrypt
Successfully installed scrypt-0.8.5
|
导入steem模块成功,运气真好。迷迷糊糊地从坑里爬出来了=_=。