如何将列表作为环境变量传递?

Cod*_*les 11 python list python-2.7

我使用列表作为Python程序的一部分,并希望将其转换为环境变量.

所以,就像这样:

list1 = ['a.1','b.2','c.3']
for items in list1:
    alpha,number = items.split('.')
    print(alpha,number)
Run Code Online (Sandbox Code Playgroud)

这让我,如预期的那样:

a 1
b 2
c 3
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将其设置为环境变量时,如下所示:

export LIST_ITEMS = 'a.1', 'b.2', 'c.3'
Run Code Online (Sandbox Code Playgroud)

并做:

list1 = [os.environ.get("LIST_ITEMS")]
for items in list1:
    alpha,number = items.split('.')
    print(alpha,number)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误: ValueError: too many values to unpack

如何修改我传递列表的方式,或者获取它以使我具有与不使用env变量相同的输出?

Mar*_*oma 14

理由

如果您希望在环境变量中构建数据,我建议使用JSON.JSON很容易编写/读取,可以写在一行,解析器存在,开发人员知道它.

解决方案

要测试,请在shell中执行:

$ export ENV_LIST_EXAMPLE='["Foo", "bar"]'
Run Code Online (Sandbox Code Playgroud)

要在同一个shell中执行的Python代码:

import os
import json

env_list = json.loads(os.environ['ENV_LIST_EXAMPLE'])
print(env_list)
print(type(env_list))
Run Code Online (Sandbox Code Playgroud)

['Foo', 'bar']
<class 'list'>
Run Code Online (Sandbox Code Playgroud)

您感兴趣的机会很高 cfg_load

  • 这应该是我接受的答案。 (2认同)
  • @daniel451 双引号是正确的 JSON,单引号不是。根据 JSON 库,它可能仍然有效,但这是忽略标准这一部分的决定:https://www.json.org/json-en.html (2认同)
  • @GonzaloGarcia当我在外面使用双引号和在里面使用单引号时,我得到了同样的错误。它似乎只适用于 `'["foo", "bar"]'` (2认同)

Reu*_*ani 10

我不确定你为什么要通过环境变量来做,但你可以这样做:

export LIST_ITEMS ="a.1 b.2 c.3"
Run Code Online (Sandbox Code Playgroud)

在Python中:

list1 = [i.split(".") for i in os.environ.get("LIST_ITEMS").split(" ")] 

for k, v in list1:
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

  • 我想使用环境变量的原因是因为我可以用我在代码中使用的东西创建一个配置文件,“source”它,如果我需要进行更改,只需更改配置文件,而不是触摸代码。我会尝试你和 @martineau 的答案,并将其中之一标记为答案。谢谢!:) (2认同)

the*_*man 9

周围的PyPI包处理我的使用情况良好:从的环境变量加载一个单一的设置,并将其强制到一个列表,INT等:

from environs import Env

env = Env()
env.read_env()  # read .env file, if it exists
# required variables
gh_user = env("GITHUB_USER")  # => 'sloria'
secret = env("SECRET")  # => raises error if not set

# casting
max_connections = env.int("MAX_CONNECTIONS")  # => 100
ship_date = env.date("SHIP_DATE")  # => datetime.date(1984, 6, 25)
ttl = env.timedelta("TTL")  # => datetime.timedelta(0, 42)

# providing a default value
enable_login = env.bool("ENABLE_LOGIN", False)  # => True
enable_feature_x = env.bool("ENABLE_FEATURE_X", False)  # => False

# parsing lists
gh_repos = env.list("GITHUB_REPOS")  # => ['webargs', 'konch', 'ped']
coords = env.list("COORDINATES", subcast=float)  # => [23.3, 50.0]
Run Code Online (Sandbox Code Playgroud)


mar*_*eau 6

如果您想使用该格式设置环境变量 \xe2\x80\x94 [\'a.1\',\'b.2\',\'c.3\']\xe2\x80\x94 这将起作用:

\n
from ast import literal_eval\n\nlist1 = [literal_eval(e.strip()) for e in os.environ["LIST_ITEMS"].split(\',\')]\nfor item in list1:\n    alpha,number = item.split(\'.\')\n    print alpha, number\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
from ast import literal_eval\n\nlist1 = [literal_eval(e.strip()) for e in os.environ["LIST_ITEMS"].split(\',\')]\nfor item in list1:\n    alpha,number = item.split(\'.\')\n    print alpha, number\n
Run Code Online (Sandbox Code Playgroud)\n