将Python3.6(Anaconda)开发的SharePoint数据拉取代码部署至Python2.7遇障求助
问题拆解与解决方案
先搞懂:GitHub和Anaconda的cryptography包为啥不一样?
这俩本质上是同个库的不同分发形式:
- GitHub上的是源码包:它只包含原始代码,需要在你的目标环境(这里是Python2.7)里编译生成适合该环境的二进制扩展文件(比如
_constant_time这类C模块)。你直接拿源码用的话,没编译当然会缺文件。 - Anaconda的是预编译二进制包:它是针对特定Python版本(比如你本地的3.6)和系统架构打包好的,里面已经包含了编译好的扩展模块。但Python2.7和3.6的C扩展ABI(应用二进制接口)不兼容,所以把3.6的包复制到2.7环境里,系统根本认不出那些编译后的文件,自然报“无法导入lib”。
解决Python2.7下cryptography安装问题的正确姿势
因为你不能升级生产环境的Python版本,只能安装支持Python2.7的cryptography旧版本——cryptography从3.0开始就放弃Python2支持了,所以我们要安装最后支持2.7的版本:2.9.2。
1. 先装系统编译依赖(针对Linux生产环境)
cryptography依赖C编译工具和SSL、FFI库,先把这些装上:
# Debian/Ubuntu 系统 sudo apt-get install build-essential libssl-dev libffi-dev python-dev # RHEL/CentOS 系统 sudo yum install gcc openssl-devel libffi-devel python-devel
2. 升级pip到支持Python2.7的最后版本
Python2.7自带的pip版本太老,可能没法正确安装旧版cryptography,先升级:
pip install --upgrade pip==20.3.4
(20.3.4是最后支持Python2.7的pip版本)
3. 安装指定版本的cryptography
现在用pip安装适配Python2.7的版本:
pip install cryptography==2.9.2
4. 验证安装是否成功
在Python2.7终端里运行:
import cryptography print cryptography.__version__ # 应该输出2.9.2,没报错就说明成了
额外:你的SharePoint代码要适配Python2.7
你的代码里有几处Python3的语法,在2.7里会报错,得改一下:
- Python2.7里
print是语句,不是函数,所以把所有print(xxx)改成print xxx(比如print(CustomLibraryPath)→print CustomLibraryPath,print (df.head())→print df.head()) - 还要确保
requests_ntlm和shareplum也装了支持Python2.7的版本:pip install requests_ntlm==1.1.0 pip install shareplum==0.5.1 # 这个版本支持Python2.7
内容的提问来源于stack exchange,提问作者Anshu Saket
相关产品推荐
相关产品推荐

