Mac M1 Monterey 12.3.1环境导入psycopg2报错求助
问题场景
- 运行环境:搭载Apple M1芯片的Mac设备,系统版本为Monterey 12.3.1
- 触发流程:执行
pip install -r requirements.txt命令安装psycopg2-binary==2.9.1后,本地启动Django项目执行python manage.py runserver命令时触发报错 - 完整报错信息:
main() File "/Users/gabrielnaughton/development/tamato/manage.py", line 25, in main execute_from_command_line(sys.argv) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line utility.execute() File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/core/management/base.py", line 343, in run_from_argv connections.close_all() File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/db/utils.py", line 232, in close_all for alias in self: File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/db/utils.py", line 226, in __iter__ return iter(self.databases) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/db/utils.py", line 153, in databases self._databases = settings.DATABASES File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/conf/__init__.py", line 82, in __getattr__ self._setup(name) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/conf/__init__.py", line 69, in _setup self._wrapped = Settings(settings_module) File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/django/conf/__init__.py", line 170, in __init__ mod = importlib.import_module(self.SETTINGS_MODULE) File "/opt/homebrew/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/Users/gabrielnaughton/development/tamato/settings/__init__.py", line 1, in <module> from settings.common import * File "/Users/gabrielnaughton/development/tamato/settings/common.py", line 16, in <module> from common.util import is_truthy File "/Users/gabrielnaughton/development/tamato/common/util.py", line 38, in <module> from psycopg2.extras import DateRange File "/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/psycopg2/__init__.py", line 51, in <module> from psycopg2._psycopg import ( # noqa ImportError: dlopen(/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/psycopg2/_psycopg.cpython-39-darwin.so, 0x0002): tried: '/Users/gabrielnaughton/development/tamato/venv/lib/python3.9/site-packages/psycopg2/_psycopg.cpython-39-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))
问题核心原因
报错本质是动态链接库架构不兼容:当前安装的psycopg2依赖二进制文件为x86_64架构,M1设备原生运行需要arm64e架构,常规高赞修复方案未生效时,可尝试以下落地解决方法。
可行修复方案
- 方案1:排查并修正终端/虚拟环境的运行架构
大部分修复无效的核心原因是当前终端或虚拟环境实际跑在Rosetta 2转译的x86模式下:- 终端执行
arch命令,若输出i386,需右键点击终端应用选择「显示简介」,取消勾选「使用Rosetta打开」,重启终端 - 激活虚拟环境后执行
python -c "import platform; print(platform.machine())",若输出x86_64,说明虚拟环境是x86架构下创建的,直接删除旧虚拟环境文件夹,重新创建arm架构虚拟环境后再安装依赖
- 终端执行
- 方案2:源码编译安装适配arm64架构的对应版本
若必须使用psycopg2-binary==2.9.1版本,可跳过预编译x86二进制包,本地编译适配:- 先卸载所有旧版本残留:
pip uninstall -y psycopg2 psycopg2-binary - 安装编译所需的系统依赖:
brew install postgresql openssl - 强制使用本地源码编译安装,不抓取预编译包:
pip install psycopg2-binary==2.9.1 --no-binary psycopg2-binary
- 先卸载所有旧版本残留:
- 方案3:升级到官方原生支持M1的稳定版本
2.9.1版本的psycopg2-binary未提供M1芯片的arm64预编译包,属于已知兼容问题,若项目依赖版本允许,直接升级到2.9.3及以上稳定版本即可,官方已提供原生arm64架构预编译包,安装后无需额外配置:pip install "psycopg2-binary>=2.9.3"
内容的提问来源于stack exchange,提问作者Gabe Naughton
相关产品推荐
相关产品推荐

