Ubuntu14.04服务器Django+Apache部署遇_ARC4.so导入错误求助
这个undefined symbol: PyUnicodeUCS2_FromString的错误我之前帮不少开发者排查过,本质是Python的Unicode编译版本不兼容导致的——你的pycrypto(或是它的替代库pycryptodome)是基于UCS2版本的Python编译安装的,但当前Apache运行的Python环境是UCS4版本,反过来的情况也有可能出现。下面是具体的解决步骤:
第一步:确认Python的Unicode版本
先登录服务器,运行命令查看系统默认Python的Unicode编译选项:
python -c "import sys; print(sys.maxunicode)"
- 输出
65535→ 对应UCS2版本; - 输出
1114111→ 对应UCS4版本。
接下来要确认Apache实际使用的Python版本(有时候系统会存在多套Python环境),可以在你的Django项目的wsgi.py里临时加一行代码:
import sys print(sys.maxunicode)
重启Apache后查看错误日志(通常路径是/var/log/apache2/error.log),就能看到Apache运行的Python对应的Unicode版本了。
第二步:重新安装兼容版本的Crypto库
明确版本差异后,按以下方式重新安装库:
场景1:Apache用的是UCS4 Python,现有Crypto是UCS2编译的
先卸载已有的Crypto库:
pip uninstall pycrypto pycryptodome
然后强制用UCS4兼容参数安装pycryptodome(推荐用这个库替代老旧的pycrypto):
CFLAGS="-DUCS4" pip install pycryptodome
场景2:Apache用的是UCS2 Python,现有Crypto是UCS4编译的
同样先卸载现有库:
pip uninstall pycrypto pycryptodome
再用UCS2参数安装:
CFLAGS="-DUCS2" pip install pycryptodome
第三步:验证修复
重启Apache服务生效:
sudo service apache2 restart
之后访问你的Django站点,检查是否还存在导入错误。如果问题依旧,可以手动删除/usr/local/lib/python2.7/site-packages/Crypto目录,再重新执行一次安装命令。
另外提一句,Ubuntu 14.04已经停止官方维护了,长期来看建议升级到更高版本的Ubuntu和Django,能避免很多类似的兼容性问题~
内容的提问来源于stack exchange,提问作者yash

