AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”
Posted
技术标签:
【中文标题】AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”【英文标题】:AWS's Elastic Beanstalk not using my virtualenv: "No module named boto" 【发布时间】:2014-06-14 18:51:44 【问题描述】:我正在尝试使用 AWS 的 Elastic Beanstalk,但是当我运行 eb start
时,我收到“ImportError: No module named boto Cannot run aws.push for local repository HEAD。”
我在我的 Django 项目的虚拟环境中。
我跑了pip install boto
,它成功了。
我做了pip freeze > requirements.txt
、git add requirements.txt
和git commit -m 'Added boto to requirements.txt'
,都成功了。
然后我进入python shell并导入boto,没有任何错误。
最后,我再次在普通命令行上运行eb start
。同样的“没有名为 boto 的模块”错误。
似乎 eb start 命令没有使用我的 virtualenv。我该怎么办?
【问题讨论】:
嗨 Michelle,我有完全相同的问题 ***.com/questions/23365374/… 如果您找到解决方案,请告诉我。谢谢! 【参考方案1】:好的,这是一个 hack,而且很丑陋,但它确实有效。
现在,错误发生在本地机器上,与远程无关。
我已经在本地安装了 boto,但我没有使用 virtualenv(出于我自己的原因,为了测试更准系统的方法)。
1 注意错误发生的位置 - 在 .git/AWSDevTools/aws/dev_tools.py 中
2 运行非virtualenv python 和
进口博托 打印 boto.文件 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/boto/init.pyc
3 打开 dev_tools.py 并将其添加到顶部:
导入系统 sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")
由于您要附加到 sys.path,如果 git aws.push 没有在它自己的东西中找到它,您只会从该添加中导入模块。
这暂时解决了这个问题,只是它会在您执行“eb init”的下一个目录中再次出现
4 转到解压缩 CLI 的位置。就我而言:
$cd ~/bin/AWS-ElasticBeanstalk-CLI-2.6.1
现在
5 寻找eb init使用的dev_tools.py原件
$find ~/bin -name dev_tools.py ~/bin/AWS-ElasticBeanstalk-CLI-2.6.1/AWSDevTools/Linux/scripts/aws/dev_tools.py
按照 #3 编辑此文件
如果你在别处再做一次 eb init,你会发现你丑陋的 hack 也在那里。
不是很好,但它有效。
附言抱歉,这里的新手,已经很晚了,我想去滑冰。
【讨论】:
【参考方案2】:我在使用 eb push 时遇到了类似的问题。问题是 eb 在将内容推送到 AWS (git aws.push) 的过程中使用 git。您可以在存储库目录的“.git/AWSDevTools/”中找到脚本。
当 git 运行时,它会修改环境变量 $PATH 并将“/usr/libexec/git-core:/usr/bin”附加到 $PATH 的开头。这使得 AWS 脚本使用 /usr/bin/python 而不是 virtualenv 上的 python,它没有安装 boto。
我通过在 AWS 脚本之上添加一个包装器来解决此问题,该包装器验证是否启用了 virtualenv 并更正了 $PATH 变量。
.git/AWSDevTools/pre.aws.elasticbeanstalk.push
#!/bin/bash
if [ -n $VIRTUAL_ENV ]; then
PATH=$VIRTUAL_ENV/bin:$PATH
fi
DIR=$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )
python $DIR/aws.elasticbeanstalk.push
然后修改.git/config文件,让aws.push别名调用wrapper
[alias "pre.aws.elasticbeanstalk"]
push = !.git/AWSDevTools/pre.aws.elasticbeanstalk.push
[alias "aws"]
push = !git pre.aws.elasticbeanstalk.push #Modified this line to call the wrapper
【讨论】:
以上是关于AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”的主要内容,如果未能解决你的问题,请参考以下文章
AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”
在 AWS Elastic Beanstalk 上设置 Django:未找到 WSGIPath
AWS Elastic Beanstalk Docker 来自 ECR 错误“Dockerrun.aws.json 中未指定 Docker 映像”
Django AWS RDS 环境变量未在 Elastic Beanstalk 中设置