当通过 shell 脚本 运行 python 代码时无法读取环境变量
Unable to read env variables when running a python code via shell script
我在 EC2 实例中托管了一个 python 脚本(使用 CI、CodeDeploy、CodePipeline)。在代码中,我将数据库的路径作为 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 运行s 和代码作为压缩文件转储到 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-dotenv
您可以使用此命令执行此操作:
pip install python-dotenv
然后在你的代码中你必须添加:
from dotenv import load_dotenv
load_dotenv()
我在这里可能是错的,但据我所知,通过编辑 .profile 文件,您可以指定要导出的环境变量 仅当您实际登录并且 运行 shell 与您为之编辑 .profile 的用户。看来您是作为 'root' 开始工作的,对他们来说 .profile 可能看起来完全不同。我猜你必须 'source' 在启动时你感兴趣的特定配置文件才能看到环境变量。
$ source /home/your_user/.profile
或者,尝试将 env 变量添加到 /etc/profile 而不是您的家庭配置文件。
我在 EC2 实例中托管了一个 python 脚本(使用 CI、CodeDeploy、CodePipeline)。在代码中,我将数据库的路径作为 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 运行s 和代码作为压缩文件转储到 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-dotenv
您可以使用此命令执行此操作:
pip install python-dotenv
然后在你的代码中你必须添加:
from dotenv import load_dotenv
load_dotenv()
我在这里可能是错的,但据我所知,通过编辑 .profile 文件,您可以指定要导出的环境变量 仅当您实际登录并且 运行 shell 与您为之编辑 .profile 的用户。看来您是作为 'root' 开始工作的,对他们来说 .profile 可能看起来完全不同。我猜你必须 'source' 在启动时你感兴趣的特定配置文件才能看到环境变量。
$ source /home/your_user/.profile
或者,尝试将 env 变量添加到 /etc/profile 而不是您的家庭配置文件。