2016-12-17 82 views
-1

运行在Ubuntu中设置环境变量,我有一个python脚本,由别人,它只是运行像这样写的:采购文件从一个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仅提供环境变量。
搜索堆栈溢出,我现在明白,它不应该工作,但我没有找到任何适合我的需求的解决方案。我不想使用os.environ与硬编码值,我不想解析出口文件。我想我可以使我的包装一个bash脚本而不是一个python,但我希望有一个更好的解决方案。有任何想法吗?

+1

你为什么要通过环境变量这样做呢?为什么不让包装脚本导入*实际函数*并用适当的参数直接调用它们? – jonrsharpe

+0

@jonrsharpe - 抱歉,但我不明白你的意思。你能否更详细地解释或举个例子? – soungalo

+0

好吧,不是真的,因为你没有显示你正在谈论的程序的任何细节。但是,如果它的结构明智,你应该能够'从cool_script import useful_func'中,然后直接调用该函数,使用你放入环境并通过命令行传递的任何值。如果不清楚如何最好地与它进行交互,为什么不与写它的人交谈? – jonrsharpe

回答

0

问题出在尝试调用bash内建的源命令中。 这应该工作:

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

比较这样的回答: Calling the "source" command from subprocess.Popen

+0

谢谢,但正如我所说的,在我希望运行的其他环境中,ENV1将不得不采取不同的值,比如'bob'。这就是为什么我不想在脚本中放置硬编码值的原因。 – soungalo

+0

然后从您放入目录的相应文件中读取值,与'/exports.sh'相同的策略。 – Schuh