Django连接PostgreSQL触发Illegal instruction:4错误,求解决方案及日志获取方法
一、先解释这个Illegal Instruction错误是什么
这个错误本质上是你的CPU无法执行psycopg2包中包含的某些机器指令。通常是因为你通过pip安装的预编译psycopg2二进制包,是基于更高版本CPU(支持比如AVX2、SSE4.2等扩展指令集)编译的,但你的Mac型号较老(Mac OS 10.11.6对应的机器大概率是2015年之前的),CPU不支持这些指令,导致程序崩溃。哪怕你故意填错数据库名称/用户名,只要Django初始化时加载psycopg2库,就会触发这个底层指令不兼容问题,所以错误表现一致。
二、如何获取更详细的错误日志
要定位具体问题,你可以通过以下几种方式获取日志:
启用Python的故障处理器
在终端执行命令时加上-X faulthandler参数,它会在程序崩溃时打印详细的调用栈和指令信息:python -X faulthandler manage.py runserver这样你能看到崩溃发生在psycopg2的哪个具体函数或指令上。
查看Mac系统崩溃报告
打开「控制台.app」(在Launchpad的其他文件夹里),在搜索框输入Python或psycopg2,找到对应的崩溃报告。报告里会包含CPU架构、触发错误的指令地址,以及更完整的进程调用栈,这能帮你确认是不是指令集不兼容的问题。配置Django日志(辅助排查)
虽然这个错误是底层库崩溃,Django可能来不及记录,但你可以在settings.py里配置更详细的日志,确认是不是数据库初始化环节触发的:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG', }, }然后再运行
runserver,看日志里有没有到加载psycopg2的环节就崩溃了。
三、针对你的环境的解决方案
结合你用的Mac OS 10.11.6、PostgresApp、Python3.6.4 virtualenv,最有效的解决方法是从源码编译psycopg2,适配你的本地CPU:
先安装Xcode命令行工具(编译依赖):
xcode-select --install按照提示完成安装即可。
配置PostgresApp的环境变量(让编译工具找到Postgres的头文件和库):
假设你用的是PostgresApp 9.x版本,在终端执行:export PATH="/Applications/Postgres.app/Contents/Versions/9.x/bin:$PATH"把
9.x换成你实际安装的版本号(比如9.6),如果是10版本就换成10。卸载现有的psycopg2,然后从源码安装:
pip uninstall psycopg2 psycopg2-binary pip install psycopg2注意不要用
psycopg2-binary,这个是预编译包,正是导致你问题的根源;直接装psycopg2会自动从源码编译,适配你的CPU指令集。验证安装:
进入Python交互环境,执行import psycopg2,如果没有报错,再运行python manage.py runserver应该就正常了。
内容的提问来源于stack exchange,提问作者sirjay

