【问题标题】:Is there a way to pass in environment variables to python script?有没有办法将环境变量传递给python脚本?
【发布时间】:2020-05-11 21:10:56
【问题描述】:

我正在尝试编写一个 python 测试,其中涉及测试提供的环境变量是否有效。我按如下方式传递环境变量 env = EnvironmentVarGuard()env.set('GOOGLE_CREDENTIALS', GOOGLE_CREDENTIALS) GOOGLE_CREDENTIALS 是从 python 文件导入的。 GOOGLE_CREDENTIALS.env 中有效,但是一旦我从文件中导入,我会收到以下错误

self.__credentials = ServiceAccountCredentials.from_json_keyfile_dict(
  File "/Users/esir/CFA/DebunkBot/venv/lib/python3.8/site-packages/oauth2client/service_account.py", line 251, in from_json_keyfile_dict
    return cls._from_parsed_json_keyfile(keyfile_dict, scopes,
  File "/Users/esir/CFA/DebunkBot/venv/lib/python3.8/site-packages/oauth2client/service_account.py", line 185, in _from_parsed_json_keyfile
    signer = crypt.Signer.from_string(private_key_pkcs8_pem)
  File "/Users/esir/CFA/DebunkBot/venv/lib/python3.8/site-packages/oauth2client/_pure_python_crypt.py", line 167, in from_string
    marker_id, key_bytes = pem.readPemBlocksFromFile(
  File "/Users/esir/CFA/DebunkBot/venv/lib/python3.8/site-packages/pyasn1_modules/pem.py", line 44, in readPemBlocksFromFile
    substrate = ''.encode().join([base64.b64decode(x.encode()) for x in certLines])
  File "/Users/esir/CFA/DebunkBot/venv/lib/python3.8/site-packages/pyasn1_modules/pem.py", line 44, in <listcomp>
    substrate = ''.encode().join([base64.b64decode(x.encode()) for x in certLines])
  File "/Users/esir/.pyenv/versions/3.8.0/lib/python3.8/base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

使用 env 变量的部分是 ServiceAccountCredentials.from_json_keyfile_dict(json.loads(os.getenv('GOOGLE_CREDENTIALS'), strict=False), scopes=self.__scope)

所以我的问题是,如果我只是在.env 文件上设置GOOGLE_CREDENTIALS,但如果我尝试使用EnvironmentVarGuard 则会失败

更新这是我使用 EnvironmentVarGuard 的方式

env = EnvironmentVarGuard()
env.clear()
env.set('GOOGLE_CREDENTIALS', GOOGLE_CREDENTIALS)

【问题讨论】:

  • EnvironmentVarGuard 的使用情况如何?你能分享一下它包含的测试用例,包括env.set 的使用吗?
  • @BernardoDuarte 我已经更新了代码

标签: python django python-3.x python-unittest django-tests


【解决方案1】:

根据docs,我相信您应该将其用作ContextManager,如下所示:

from test.support import EnvironmentVarGuard
with EnvironmentVarGuard() as env:
    env.clear()
    env.set('GOOGLE_CREDENTIALS', GOOGLE_CREDENTIALS)
    # put your code inside context manager

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2016-01-10
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多