Python RPi 上虚拟环境中的脚本 运行 找不到 AWS 环境变量
Python Script Running in Virtual Environment on RPi Cannot Find AWS Environment Variables
我有一个 Python 脚本,它 运行 在虚拟环境中从 Raspberry Pi 上的服务文件启动。服务文件如下所示:
[Unit]
Description=Starts IEQ sensors
[Service]
ExecStart = /home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/bevo_iaq/bevobeacon-iaq/main.py
Restart=always
RestartSec=60s
[Install]
WantedBy=bevobeacon.service
main.py
脚本包含以下行以访问环境变量:
# AWS credentials
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
BUCKET_NAME = os.environ['BUCKET_NAME']
我将这些变量导出为来自 /etc/profile
:
的 last 行
export AWS_ACCESS_KEY_ID='<aws_access_key>'
export AWS_SECRET_ACCESS_KEY='<aws_secret_access_key>'
export BUCKET_NAME='<bucket_name>'
当树莓派试图通过服务文件 运行 启动脚本时,出现以下错误:
Feb 21 08:43:57 raspberrypi systemd[1]: Started Starts IEQ sensors.
Feb 21 08:43:58 raspberrypi sudo[296]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/be
Feb 21 08:43:58 raspberrypi sudo[296]: pam_unix(sudo:session): session opened for user root by (uid=0)
Feb 21 08:44:03 raspberrypi sudo[296]: environ({'LANG': 'en_GB.UTF-8', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
Feb 21 08:44:03 raspberrypi sudo[296]: Traceback (most recent call last):
Feb 21 08:44:03 raspberrypi sudo[296]: File "/home/pi/bevo_iaq/bevobeacon-iaq/main.py", line 213, in <module>
Feb 21 08:44:03 raspberrypi sudo[296]: asyncio.run(main(beacon = beacon))
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
Feb 21 08:44:03 raspberrypi sudo[296]: return loop.run_until_complete(main)
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
Feb 21 08:44:03 raspberrypi sudo[296]: return future.result()
Feb 21 08:44:03 raspberrypi sudo[296]: File "/home/pi/bevo_iaq/bevobeacon-iaq/main.py", line 32, in main
Feb 21 08:44:03 raspberrypi sudo[296]: AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/os.py", line 678, in __getitem__
Feb 21 08:44:03 raspberrypi sudo[296]: raise KeyError(key) from None
Feb 21 08:44:03 raspberrypi sudo[296]: KeyError: 'AWS_ACCESS_KEY_ID'
但是,当我手动 运行 脚本时,它没有任何问题:
pi@raspberrypi:~/bevo_iaq $ source .venv/bin/activate
(.venv) pi@raspberrypi:~/bevo_iaq $ python3 -E bevobeacon-iaq/main.py
.
.
.
/home/pi/DATA/b07_2022-02-21.csv was uploaded to AWS S3 bucket: <bucket_name>
我不确定问题出在哪里,但是当脚本 运行s 从启动时似乎没有正确加载环境变量。我从另一个问题中看到,在使用 sudo
时环境变量被清除,但我没有,但我也从错误日志中看到我正在 运行 将脚本作为 root 用户 - 也许就是这样问题?
如果您真的想进入兔子洞,可以找到整个项目here。
systemd的用户实例不继承.bashrc、/etc/profile等文件中设置的环境变量
有几种方法可以为 systemd 服务设置环境变量,一种是在您的服务文件中提供它们:
[Unit]
Description=Starts IEQ sensors
[Service]
EnvironmentFile=/lib/systemd/system/myenv.env
ExecStart = /home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/bevo_iaq/bevobeacon-iaq/main.py
Restart=always
RestartSec=60s
[Install]
WantedBy=bevobeacon.service
在myenv.env
中:
AWS_ACCESS_KEY_ID=SECRET_1
AWS_SECRET_ACCESS_KEY=SECRET_2
BUCKET_NAME=SECRET_3
我有一个 Python 脚本,它 运行 在虚拟环境中从 Raspberry Pi 上的服务文件启动。服务文件如下所示:
[Unit]
Description=Starts IEQ sensors
[Service]
ExecStart = /home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/bevo_iaq/bevobeacon-iaq/main.py
Restart=always
RestartSec=60s
[Install]
WantedBy=bevobeacon.service
main.py
脚本包含以下行以访问环境变量:
# AWS credentials
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
BUCKET_NAME = os.environ['BUCKET_NAME']
我将这些变量导出为来自 /etc/profile
:
export AWS_ACCESS_KEY_ID='<aws_access_key>'
export AWS_SECRET_ACCESS_KEY='<aws_secret_access_key>'
export BUCKET_NAME='<bucket_name>'
当树莓派试图通过服务文件 运行 启动脚本时,出现以下错误:
Feb 21 08:43:57 raspberrypi systemd[1]: Started Starts IEQ sensors.
Feb 21 08:43:58 raspberrypi sudo[296]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/be
Feb 21 08:43:58 raspberrypi sudo[296]: pam_unix(sudo:session): session opened for user root by (uid=0)
Feb 21 08:44:03 raspberrypi sudo[296]: environ({'LANG': 'en_GB.UTF-8', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
Feb 21 08:44:03 raspberrypi sudo[296]: Traceback (most recent call last):
Feb 21 08:44:03 raspberrypi sudo[296]: File "/home/pi/bevo_iaq/bevobeacon-iaq/main.py", line 213, in <module>
Feb 21 08:44:03 raspberrypi sudo[296]: asyncio.run(main(beacon = beacon))
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
Feb 21 08:44:03 raspberrypi sudo[296]: return loop.run_until_complete(main)
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
Feb 21 08:44:03 raspberrypi sudo[296]: return future.result()
Feb 21 08:44:03 raspberrypi sudo[296]: File "/home/pi/bevo_iaq/bevobeacon-iaq/main.py", line 32, in main
Feb 21 08:44:03 raspberrypi sudo[296]: AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
Feb 21 08:44:03 raspberrypi sudo[296]: File "/usr/lib/python3.7/os.py", line 678, in __getitem__
Feb 21 08:44:03 raspberrypi sudo[296]: raise KeyError(key) from None
Feb 21 08:44:03 raspberrypi sudo[296]: KeyError: 'AWS_ACCESS_KEY_ID'
但是,当我手动 运行 脚本时,它没有任何问题:
pi@raspberrypi:~/bevo_iaq $ source .venv/bin/activate
(.venv) pi@raspberrypi:~/bevo_iaq $ python3 -E bevobeacon-iaq/main.py
.
.
.
/home/pi/DATA/b07_2022-02-21.csv was uploaded to AWS S3 bucket: <bucket_name>
我不确定问题出在哪里,但是当脚本 运行s 从启动时似乎没有正确加载环境变量。我从另一个问题中看到,在使用 sudo
时环境变量被清除,但我没有,但我也从错误日志中看到我正在 运行 将脚本作为 root 用户 - 也许就是这样问题?
如果您真的想进入兔子洞,可以找到整个项目here。
systemd的用户实例不继承.bashrc、/etc/profile等文件中设置的环境变量
有几种方法可以为 systemd 服务设置环境变量,一种是在您的服务文件中提供它们:
[Unit]
Description=Starts IEQ sensors
[Service]
EnvironmentFile=/lib/systemd/system/myenv.env
ExecStart = /home/pi/bevo_iaq/.venv/bin/python3 -E /home/pi/bevo_iaq/bevobeacon-iaq/main.py
Restart=always
RestartSec=60s
[Install]
WantedBy=bevobeacon.service
在myenv.env
中:
AWS_ACCESS_KEY_ID=SECRET_1
AWS_SECRET_ACCESS_KEY=SECRET_2
BUCKET_NAME=SECRET_3