我们可以从 ~/.bash_profile 加载环境变量而无需 source ~./bash_profile 吗?

Can we load environment variables from ~/.bash_profile without having to source ~./bash_profile?

我有一个名为 scraper.py 的 python 脚本,它在某些日子从网络上抓取信息。这些天,我使用 cronjob 将此脚本自动化为 运行。现在每次脚本 运行s 时,我都想向 Slack 发送通知以确保抓取成功。所以我创建了一个不同的脚本 helper_functions.py,它具有向 Slack 发送消息的功能。现在,因为我正在使用无法在脚本中共享的 API_KEY,因为我将其推送到 GitHub,所以我将其存储在 ~./.bash_profile 中。如果我从终端执行 source ~/.bash_profile,脚本 运行 完全没问题,但是当我关闭会话时,代码会中断。那么有没有办法在不获取 bash 文件夹的情况下使其工作?

脚本如下 scraper.py

import datetime
import helper_functions as hf


hf.slack_msg("Start scrape")

class IndexSpider(scrapy.Spider):
    name = "index"
    start_urls = [
        "https://finance.yahoo.com"
    ]

    def parse(self, response):
        index = response.css("span.Trsdu\(0\.3s\)::text").getall()
        yield {
            'datetime'          : datetime.datetime.now().strftime("%Y-%m-%d %X"),
            's&p_500'           : index[0],
            's&p_500_delta'     : index[1],
            's&p_500_delta(%)'  : index[2],
            'dow_30'            : index[3],
            'dow_30_delta'      : index[4],
            'dow_30_delta(%)'   : index[5],
            'nasdaq'            : index[6],
            'nasdaq_delta'      : index[7],
            'nasdaq_delta(%)'   : index[8],
        }

hf.slack_msg("End scrape")

helper_functions.py

import json
import os

def slack_msg(msg):

    data = {
        "text" : msg
    }

    webhook = os.environ.get("SLACK_API_KEY")
    requests.post(webhook, json.dumps(data))

这是一个想法:

  • 将令牌放在它自己的文件中,例如~/.secrets/slack_api_key.txt
  • 修改 ~/.bash_profile 做 export SLACK_API_KEY=$(cat ~/.secrets/slack_api_key.txt)
  • 修改helper_functions.py做webhook = os.environ.get("SLACK_API_KEY") or open(os.path.expanduser("~/.secrets/slack_api_key.txt")).read().strip(),会先查找环境变量,如果变量没有定义则返回读取文件

crontab 中的活动行将是环境设置或 cron 命令。环境设置的形式为,

     name = value

所以你可以添加

SLACK_API_KEY='theapikey'

* * * * * scraper.py