M2Crypto有两个依赖,openssl和swig,在Mac上需要首先安装这两个包,才能安装M2Crypto。
安装依赖:
brew install openssl
brew install swig
# 有时候需要手动链接swig
# brew unlink swig && brew link swig
然后安装可能会出现错误
Building wheels for collected packages: m2crypto
Building wheel for m2crypto (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /Users/vic/.pyenv/versions/3.7.5/envs/storage/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/tmp/pip-install-48d42grt/m2crypto/setup.py'"'"'; __file__='"'"'/private/tmp/pip-install-48d42grt/m2crypto/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/tmp/pip-wheel-6mytatj4
cwd: /private/tmp/pip-install-48d42grt/m2crypto/
Complete output (53 lines):
running bdist_wheel
running build
running build_py
copying M2Crypto/callback.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/EVP.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/AuthCookie.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/m2.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/ftpslib.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/EC.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/httpslib.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/X509.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/util.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/RSA.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/BIO.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/DH.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/__init__.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/threading.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/Rand.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/SMIME.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/Engine.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/m2xmlrpclib.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/RC4.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/m2urllib2.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/DSA.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/six.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/m2urllib.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/BN.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/m2crypto.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/Err.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
copying M2Crypto/ASN1.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto
creating build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/cb.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/Session.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/timeout.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/__init__.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/TwistedProtocolWrapper.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/Cipher.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/Connection.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/Context.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/SSLServer.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/ssl_dispatcher.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
copying M2Crypto/SSL/Checker.py -> build/lib.macosx-10.15-x86_64-3.7/M2Crypto/SSL
running build_ext
building 'M2Crypto._m2crypto' extension
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c
swig -python -py3 -I/Users/vic/.pyenv/versions/3.7.5/envs/storage/include -I/Users/vic/.pyenv/versions/3.7.5/include/python3.7m -I/usr/include/openssl -I/usr/local/include -I/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -I/Library/Developer/CommandLineTools/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory) -I/usr/local/include -I/Library/Developer/CommandLineTools/usr/lib/clang/11.0.3/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -I/Library/Developer/CommandLineTools/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory) -includeall -modern -builtin -outdir /private/tmp/pip-install-48d42grt/m2crypto/M2Crypto -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i
Deprecated command line option: -modern. This option is now always on.
SWIG/_m2crypto.i:62: Error: Unable to find 'openssl/opensslv.h'
SWIG/_m2crypto.i:68: Error: Unable to find 'openssl/safestack.h'
SWIG/_evp.i:12: Error: Unable to find 'openssl/opensslconf.h'
SWIG/_rc4.i:5: Error: Unable to find 'openssl/opensslconf.h'
SWIG/_ec.i:7: Error: Unable to find 'openssl/opensslconf.h'
error: command 'swig' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for m2crypto
可以在报错中看到,在build阶段就出现了这个错误,错误的截取不全,还有后续的setup,抛出和build失败相同的错误,这时候需要指定ooenssl和swig的路径
在stackoverflow中找到相同的问题,可以参考:stackoverflow.com/questions/3…
使用
env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" SWIG_FEATURES="-cpperraswarn -includeall -I$(brew --prefix openssl)/include" pip install M2Crypto
以上命令可以直接复制粘贴使用,如果你需要指定版本号,则在命令最后指定。