【问题标题】:Sourcing a file to set environment variables from within a python script从 python 脚本中获取文件以设置环境变量
【发布时间】:2016-12-17 12:20:10
【问题描述】:

在 Ubuntu 上运行,我有一个 python 脚本,由其他人编写,运行如下:

python cool_script.py command line args

但是,此脚本需要设置一些环境变量才能运行。所以我创建了exports.sh,位于与python脚本相同的目录中,看起来像:

export ENV1='foo'
export ENV2='bar'
export ENV3='baz'

这么跑:

$source exports.sh
$python cool_script.py command line args

效果很好。但是,我的情况要复杂一些。我需要在几个环境中运行它,其中 ENV1、ENV2、ENV3 的值必须不同。我还想对cool_script.py 的输出做一些事情。于是我写了cool_script_wrapper.py,看起来是这样的:

# set environment variables
import os
exports_file = os.path.dirname(os.path.realpath(__file__)) + '/exports.sh'
os.system('source %s' % exports_file)
# run cool_script.py
os.system('python cool_script.py command line args')
# do some stuff to the output
...

我计划为我需要运行的每个环境使用不同的exports.sh 脚本,并始终将它们与主脚本放在同一个目录中。唯一的问题是这种“源”方法不起作用。 cool_script.py 根本无法使用环境变量。
搜索 Stack Overflow,我现在明白它不应该工作,但我没有找到任何适合我需要的解决方案。我不想将os.environ 与硬编码值一起使用,也不想解析导出文件。我想我可以让我的包装器成为 bash 脚本而不是 python,但我希望有更好的解决方案。有什么想法吗?

【问题讨论】:

  • 你为什么要通过环境变量来做这个?为什么不让包装脚本导入实际函数并使用适当的参数直接调用它们?
  • @jonrsharpe - 对不起,但我不明白你的意思。能否详细解释或举个例子?
  • 不是真的,因为您没有显示您正在谈论的程序的任何细节。但是,如果它的结构合理,您应该能够from cool_script import useful_func,然后使用您已放入环境并通过命令行传递的任何值直接调用该函数。如果不清楚如何最好地与它互动,为什么不与编写它的人交谈?
  • 我为什么要这样做?我希望cool_script.py 按原样运行,从头到尾。无论如何,我仍然不明白这将如何解决我的问题。
  • 1.为什么?请给出一些上下文。 2. 完全消除问题,因为您不需要设置环境变量。

标签: python environment-variables


【解决方案1】:

问题出在试图调用 bash 内置命令的源命令中。 这应该有效:

import os
os.environ['ENV1'] = "foo"
os.system("python cool_script.py command line args")

比较一下这个答案: Calling the "source" command from subprocess.Popen

【讨论】:

  • 谢谢,但正如我所说,在我希望运行 ENV1 的其他环境中,必须采用不同的值,例如“bob”。这就是为什么我不想在我的脚本中放入硬编码的值。
  • 然后从您放入目录中的相应文件中读取值,与“/exports.sh”相同的策略。
猜你喜欢
  • 2012-01-19
  • 2013-10-26
  • 2020-04-05
  • 2012-01-12
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多