Apple M1环境Bash脚本报错:psycopg2缺失_PQbackendPID符号
问题:Apple M1设备上Bash脚本运行Django服务时psycopg2加载失败
环境与脚本信息
使用Apple M1设备,编写的Bash脚本如下:
#!/bin/sh # Open Activity Tracker website python -m webbrowser http://127.0.0.1:8000/ # Activate virtual environment . dj-env/bin/activate # Navigate to Activity Tracker project folder cd dj_activity_tracker # Run Django local development server python manage.py runserver
确认信息
- 手动执行时使用同一虚拟环境:是
- 依赖安装在虚拟环境中:是
- 虚拟环境内psycopg2-binary版本:2.9.5
错误现象
手动在终端执行命令正常,但运行脚本时出现错误:
File "/Users/doge/Desktop/dj-env/lib/python3.11/site-packages/django/db/backends/postgresql/base.py", line 28, in <module> raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e) django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: dlopen(/Users/doge/Desktop/dj-env/lib/python3.11/site-packages/psycopg2/_psycopg.cpython-311-darwin.so, 0x0002): symbol not found in flat namespace (_PQbackendPID)
已尝试操作:卸载重装psycopg2、brew安装postgresql
问题原因
核心是脚本执行时的环境变量与手动终端环境不一致:
- 手动执行时,你的终端shell(如zsh)已加载brew安装的PostgreSQL相关环境变量,但
#!/bin/sh是POSIX标准shell,不会读取zsh的配置文件(.zshrc、.bash_profile等),导致脚本运行时无法找到PostgreSQL的动态链接库路径。 - 脚本开头的
python调用可能指向系统默认Python,虽然后续激活了虚拟环境,但环境变量缺失才是psycopg2加载失败的关键。
解决方案
方案1:在脚本中显式指定PostgreSQL库路径
在激活虚拟环境前,添加brew安装的PostgreSQL库路径(M1设备brew默认路径为/opt/homebrew):
#!/bin/sh # 设置PostgreSQL动态库路径 export DYLD_FALLBACK_LIBRARY_PATH="/opt/homebrew/opt/postgresql/lib:$DYLD_FALLBACK_LIBRARY_PATH" # 使用虚拟环境内的Python打开网页,避免调用系统Python ./dj-env/bin/python -m webbrowser http://127.0.0.1:8000/ # Activate virtual environment . dj-env/bin/activate # Navigate to Activity Tracker project folder cd dj_activity_tracker # Run Django local development server python manage.py runserver
方案2:改用zsh执行脚本
将脚本的shebang改为#!/bin/zsh,让脚本读取你的zsh配置文件中的环境变量:
#!/bin/zsh # Open Activity Tracker website python -m webbrowser http://127.0.0.1:8000/ # Activate virtual environment . dj-env/bin/activate # Navigate to Activity Tracker project folder cd dj_activity_tracker # Run Django local development server python manage.py runserver
确保.zshrc中已添加PostgreSQL环境变量(brew安装后通常自动添加):
export PATH="/opt/homebrew/opt/postgresql/bin:$PATH" export DYLD_FALLBACK_LIBRARY_PATH="/opt/homebrew/opt/postgresql/lib:$DYLD_FALLBACK_LIBRARY_PATH"
方案3:直接使用虚拟环境内Python的绝对路径
无需手动激活环境,直接调用虚拟环境内的Python执行命令:
#!/bin/sh # Open Activity Tracker website /Users/doge/Desktop/dj-env/bin/python -m webbrowser http://127.0.0.1:8000/ # Navigate to Activity Tracker project folder cd dj_activity_tracker # 直接用虚拟环境内的Python运行服务 /Users/doge/Desktop/dj-env/bin/python manage.py runserver
验证方法
可在脚本开头添加echo $DYLD_FALLBACK_LIBRARY_PATH,查看输出是否包含/opt/homebrew/opt/postgresql/lib,确认环境变量是否正确加载。
内容的提问来源于stack exchange,提问作者Chicken McNuggets
相关产品推荐
相关产品推荐

