使用Capistrano部署Pipenv项目时遇ioctl错误及模块无法识别问题
解决Capistrano部署Pipenv项目的两类问题
问题1:pipenv shell执行报错termios.error: (25, 'Inappropriate ioctl for device')
pipenv shell是用于启动交互式虚拟环境终端的命令,而Capistrano的execute运行在非交互式环境中,没有TTY终端支持,因此会触发该错误。
解决办法
无需使用pipenv shell,直接通过pipenv run包裹需要在虚拟环境内执行的命令,或者直接调用虚拟环境的Python解释器路径即可。
问题2:pipenv run执行迁移时提示ModuleNotFoundError: No module named 'django'
从日志可见pipenv install执行成功,但迁移时找不到依赖,核心原因是执行pipenv命令时未处于项目根目录。Pipenv依赖当前目录下的Pipfile/Pipfile.lock识别项目并关联对应虚拟环境,而Capistrano默认执行命令的路径并非你的release目录,导致pipenv run无法匹配正确的虚拟环境。
解决办法
修改Capistrano任务,先切换到项目的release目录,再执行pipenv相关命令:
task :bundle do on roles(:app) do within release_path do execute "/home/ubuntu/.pyenv/shims/pipenv install" end end end task :migrate do on roles(:app) do within release_path do execute "/home/ubuntu/.pyenv/shims/pipenv run python manage.py makemigrations" execute "/home/ubuntu/.pyenv/shims/pipenv run python manage.py migrate" end end end
备选验证方案
如果问题仍存在,可先获取虚拟环境的Python路径,直接调用该路径执行命令:
# 获取虚拟环境内的Python路径 pipenv_python = capture("/home/ubuntu/.pyenv/shims/pipenv --py").strip # 用该路径执行迁移 execute "#{pipenv_python} #{release_path}/manage.py makemigrations" execute "#{pipenv_python} #{release_path}/manage.py migrate"
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

