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

Python 如何将列表作为环境变量传递?,python,python-2.7,Python,Python 2.7,我使用列表作为Python程序的一部分,并希望将其转换为环境变量 所以,是这样的: list1 = ['a.1','b.2','c.3'] for items in list1: alpha,number = items.split('.') print(alpha,number) 正如所料,这给了我: a 1 b 2 c 3 但当我尝试将其设置为环境变量时,如下所示: export LIST_ITEMS = 'a.1', 'b.2', 'c.3' 并且做: list1 =

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

所以,是这样的:

list1 = ['a.1','b.2','c.3']
for items in list1:
    alpha,number = items.split('.')
    print(alpha,number)
正如所料,这给了我:

a 1
b 2
c 3
但当我尝试将其设置为环境变量时,如下所示:

export LIST_ITEMS = 'a.1', 'b.2', 'c.3'
并且做:

list1 = [os.environ.get("LIST_ITEMS")]
for items in list1:
    alpha,number = items.split('.')
    print(alpha,number)
我收到一个错误:
ValueError:要解压缩的值太多


如何修改传递列表的方式或获取列表的方式,以便在不使用环境变量的情况下获得与相同的输出?

我不确定您为什么要通过环境变量执行此操作,但您可以执行以下操作:

export LIST_ITEMS ="a.1 b.2 c.3"
在Python中:

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

for k, v in list1:
    print(k, v)

如果要使用该格式设置环境变量,则可以执行以下操作:

from ast import literal_eval

list1 = [literal_eval(e.strip()) for e in os.environ["LIST_ITEMS"].split(',')]
for item in list1:
    alpha,number = item.split('.')
    print alpha, number
输出:

a1
b 2
C3
基本原理 如果希望在环境变量中结构化数据,我建议使用JSON。JSON易于写/读,可以在一行中编写,解析器存在,开发人员知道这一点

解决方案 要进行测试,请在shell中执行以下操作:

$ export ENV_LIST_EXAMPLE='["Foo", "bar"]'
要在同一shell中执行的Python代码:

import os
import json

env_list = json.loads(os.environ['ENV_LIST_EXAMPLE'])
print(env_list)
print(type(env_list))
给予

['Foo','bar']
包裹 您很可能对PyPI包很好地处理了我的用例感兴趣:从env var加载单个设置,并将其强制为列表、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]

我之所以想使用env变量,是因为我可以用我在代码中使用的东西创建一个配置文件,
source
it,如果我需要更改,只需更改配置文件,而不是触摸代码。我会试试你和@martineau的答案,并将其中一个标记为答案。谢谢!:)为什么不把它放在某个存储器(如文件)中并引用该存储器?当我导出列表项时,我遇到了这个错误:导出:`=a.1 b.2 c.3':不是有效的标识符这应该是我可以接受的答案。
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]