如何运行作为我在 AWS SSH 会话中上传的应用程序的一部分的 Python 脚本?

Posted

技术标签:

【中文标题】如何运行作为我在 AWS SSH 会话中上传的应用程序的一部分的 Python 脚本?【英文标题】:How do I run a Python script that is part of an application I uploaded in an AWS SSH session? 【发布时间】:2015-03-15 03:04:48 【问题描述】:

我正在尝试运行作为 AWS Elastic Beanstalk 应用程序的一部分从我的开发机器上传的 Python 脚本,但不知道如何操作。我相信我有 located the script correctly,但是当我尝试在 SSH 下运行它时,我收到了一个导入错误。

例如,我有一个 Flask-Migrate 迁移脚本作为我的应用程序的一部分(与 example in the documentation 几乎相同),但在成功通过 SSH 连接到我的 EB 实例之后

> eb ssh

和locating the script 一起

$ sudo find / -name migrate.py

当我在我所在的目录 (/opt/python/current) 中运行时

$ python migrate.py db upgrade

在 SSH 提示符下我得到

Traceback (most recent call last):
  File "db_migrate.py", line 15, in <module>
    from flask.ext.script import Manager
ImportError: No module named flask.ext.script

即使我的requirements.txt(与我的其他文件在同一目录中)有flask-script==2.0.5

在 Heroku 上,我可以分两步完成所有这些操作

> heroku run bash
$ python migrate.py db upgrade

AWS 上是否有同等功能?也许我错过了设置代码运行环境的步骤?

【问题讨论】:

【参考方案1】:

要迁移您的数据库,最好使用container_commands,它们是每次部署应用程序时都会运行的命令。 EBS documentation(第 6 步)中有一个很好的例子:

container_commands:
  01_syncdb:    
    command: "django-admin.py syncdb --noinput"
    leader_only: true

您获得ImportError 的原因是因为 EBS 将您的软件包安装在 virtualenv 中。在 SSH 中在您的应用程序中运行任意脚本之前,首先使用

切换到包含您的(最新)代码的目录
cd /opt/python/current

然后激活virtualenv

source /opt/python/run/venv/bin/activate

并设置环境变量(您的脚本可能期望的)

source /opt/python/current/env

【讨论】:

啊,一个虚拟环境;大概就是这样! 除此之外,您永远不应该直接使用 ssh 编辑您的实例,因为 EB 可以随时更换您的实例,并且直接在盒子上进行的任何更改都不会保留。 @NickHumrich:container_commands 每次部署时都会自动运行吗?在其他时候手动运行会怎么样(即,相当于上面的 Heroku 示例:运行任意脚本与我的应用程序所具有的所有上下文)? container_commands 将在每次容器启动时运行。这包括部署、新实例等。您应该避免手动运行,因为它不可扩展。如果你有需要运行的任务,你应该将它们写入你的 webapp,或者使用工作环境。 @raxacoricofallapatorius ebextensions(container_commands 是 ebextension 的一种形式)与您的代码一起打包,所以是的,它将在运行时使用新的代码/文件。

以上是关于如何运行作为我在 AWS SSH 会话中上传的应用程序的一部分的 Python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

从 SSH 会话到远程机器,如何在本地机器上的 Vim 会话中打开文件

Aws Elasticbean 不运行我的 .jar 应用程序

无法通过 AWS Session Manager 工作获得 SSH 连接

如何在远程 Linux ssh 会话上运行的 vim 中拉到本地 OSX 剪贴板?

如何强制从另一个 SSH 会话中分离屏幕?

在aws elastic beanstalk上上传文件?