【问题标题】:Unable to read env variables when running a python code via shell script通过 shell 脚本运行 python 代码时无法读取环境变量
【发布时间】:2020-12-02 03:06:12
【问题描述】:

我在 EC2 实例中托管了一个 Python 脚本(使用 CI、CodeDeploy、CodePipeline)。在代码中,我将DB的路径作为env变量如下:

def db_connection():
    DB_ADAPTER = os.environ.get('DB_ADAPTER')
    DB_USER = os.environ.get('DB_USER')
    DB_PASSWORD = os.environ.get('DB_PASSWORD')
    DB_HOST = os.environ.get('DB_HOST')
    DB_NAME = os.environ.get('DB_NAME')
    engine_url = DB_ADAPTER + '://' + DB_USER + ':' + \
        DB_PASSWORD + '@' + DB_HOST + '/' + DB_NAME
    eng = db.create_engine(engine_url)
    conn = eng.connect()
    print('Connected to the DB')
    return eng, conn

我启动了实例,运行它并执行了nano .profile。在.profile 中,我手动添加了以下几行:

export DB_ADAPTER=postgresql+psycopg2
export DB_USER=dummy_user
export DB_PASSWORD=dummy_pwd
export DB_HOST=ec2-xx-xxx-xxx-xxx.eu-central-1.compute.amazonaws.com
export DB_NAME=dummy_db

当我将代码推送到 GitLab 存储库时,CI 运行并将代码作为压缩文件转储到 S3 存储桶中,然后 CodeDeploy 和 CodePipeline 启动。

在这个阶段我收到以下错误:

start_script.sh 是:

#!/usr/bin/env bash
cd /home/ubuntu/anomaly-detection/
python3.7 ad_fbprophet.py
exit

appspec.yml:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/anomaly-detection
permissions:
- object: /
  pattern: "*"
  owner: root
  group: root
hooks:
  BeforeInstall:
    - location: /scripts/before_install.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: /scripts/start_script.sh
      runas: ubuntu

但是,当我从笔记本电脑登录 EC2 实例并运行 python 脚本时,它运行完美,没有任何错误,并给出了输出。

感谢任何帮助。

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-ec2 aws-code-deploy


    【解决方案1】:

    我在这里可能错了,但据我所知,通过编辑 .profile 文件,您可以指定要导出的环境变量 只有在您实际登录并使用您为其编辑 .profile 的用户运行 shell 时。看来您以 .profile 可能看起来完全不同的“根”身份开始您的工作。我想您必须在启动时“获取”您感兴趣的特定配置文件才能查看环境变量。

    $ source /home/your_user/.profile
    

    或者,尝试将环境变量添加到 /etc/profile 而不是您的主配置文件。

    【讨论】:

    • 我添加了source 命令并且它起作用了。非常感谢
    【解决方案2】:

    你必须安装python-dotenv

    你可以用这个命令做到这一点:

    pip install python-dotenv
    

    然后你必须在你的代码中添加:

    from dotenv import load_dotenv
    
    load_dotenv()
    

    【讨论】:

    • 嘿,为了使用 dotenv,我必须在 repo 中有一个 .env 文件,对吧?
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多