AWS Elastic Beanstalk未使用我的虚拟环境:“没有名为boto的模块”

1 投票
2 回答
6554 浏览
提问于 2025-04-18 04:41

我正在尝试使用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.txtgit add requirements.txtgit commit -m 'Added boto to requirements.txt',这些都成功了。 然后我进入了Python的命令行,成功导入了boto,没有出现任何错误。 最后,我再次在普通命令行中运行 eb start,结果还是出现了“没有名为boto的模块”的错误。

看起来 eb start 命令没有使用我的虚拟环境。我该怎么办呢?

2 个回答

0

我遇到过类似的问题,使用 eb push 的时候。问题在于 eb 在推送内容到 AWS 的过程中会用到 git(也就是 git aws.push)。你可以在你的代码库目录下的 ".git/AWSDevTools/" 找到相关的脚本。

当 git 运行时,它会修改一个叫做 $PATH 的环境变量,并把 "/usr/libexec/git-core:/usr/bin" 加到 $PATH 的最前面。这就导致 AWS 的脚本使用的是 /usr/bin/python,而不是虚拟环境中的 python,因为虚拟环境里没有安装 boto 这个库。

我通过在 AWS 脚本上加了一个包装器来解决这个问题,这个包装器会检查是否启用了虚拟环境,并且修正 $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 的别名调用这个包装器。

[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
1

好吧,这个方法有点黑科技,而且看起来不太好,但它确实有效。

现在,错误发生在本地机器上,和远程没有关系。

我在本地安装了boto,并且没有使用虚拟环境(出于我自己的原因,我想测试一种更简单的方法)。

1 注意错误发生的位置 - 在 .git/AWSDevTools/aws/dev_tools.py

2 运行一个非虚拟环境的Python,然后

导入boto 打印boto.file /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/boto/init.pyc

3 打开那个dev_tools.py文件,并在顶部添加以下内容:

导入sys 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,你会发现你的这个黑科技也在那里。

虽然不太完美,但确实有效。

附言:抱歉格式不太好,我是新手,现在很晚了,我想去滑冰。

撰写回答