我编写了如下配置文件:
bucket_name=some-bucket
我运行命令source config_de_local
其中config_de_local是其中变量要设置的文件名被存储。
然后我运行命令:echo $bucket_name
,然后得到o / p:some-bucket
。
但是,配置文件仍然无法导入任何变量,它规定所有为空。这就是我导入变量的方式:
bucket_name = os.getenv('bucket_name', '')
但是,在终端中,如果我运行以下命令:export bucket_name=some-bucket
,然后在Python3 shell中运行以下行:print(os.getenv('bucket_name',''))
,则会得到所需的输出。
注意:我正在运行Python3在virtualenv中;我激活它,并且然后经由设置我的env变量source
和export
。
答案 0 :(得分:0)
之所以不起作用,是因为未导出的环境变量仅对当前进程(在您的情况下为Bash)可见,而对任何子进程(例如Python)不可见。确实确实需要导出,或者可以在像这样运行Python时专门指定变量:
fots ~ $ bucket_name=some-bucket python3
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv('bucket_name', '')
'some-bucket'
对于您希望获取它们的情况,一个简单的解决方案是在您获取的脚本中导出这些变量(依次将它们导出到当前shell中)。
例如
fots ~ $ cat config_de_local
export bucket_name=some-bucket
fots ~ $ source config_de_local
fots ~ $ python3
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv('bucket_name', '')
'some-bucket'
有多种方法可以将这些导出的环境变量提供给您的应用程序。包装该程序的简单外壳脚本将起作用(如您所做的那样)。该脚本将激活virtualenv,然后获取文件。
或者,如果该应用程序是在后台运行的守护程序,则创建systemd或超级服务也可以,因为您还可以在服务定义中指定环境变量。
希望这会有所帮助!
福蒂斯