在python脚本中设置环境变量

问题描述 投票:42回答:4

我有一个bash脚本,用于设置环境变量并运行命令

LD_LIBRARY_PATH=my_path
sqsub -np $1 /homedir/anotherdir/executable

现在我想使用python而不是bash,因为我想计算一些我传递给命令的参数。

我试过了

putenv("LD_LIBRARY_PATH", "my_path")

call("export LD_LIBRARY_PATH=my_path")

其次是

call("sqsub -np " + var1 + "/homedir/anotherdir/executable")

但是程序总是放弃,因为没有设置LD_LIBRARY_PATH。

我怎样才能解决这个问题?

感谢帮助!

(如果我在调用python脚本之前导出LD_LIBRARY_PATH一切正常,但我希望python确定路径并将环境变量设置为正确的值)

python export
4个回答
51
投票

庆典:

LD_LIBRARY_PATH=my_path
sqsub -np $1 /path/to/executable

类似,在Python中:

import os
import subprocess
import sys

os.environ['LD_LIBRARY_PATH'] = "my_path" # visible in this process + all children
subprocess.check_call(['sqsub', '-np', sys.argv[1], '/path/to/executable'],
                      env=dict(os.environ, SQSUB_VAR="visible in this subprocess"))

8
投票

您可以使用添加元素到您的环境

os.environ['LD_LIBRARY_PATH'] = 'my_path'

并通过使用在shell(使用您的os.environ)中运行子进程

subprocess.call('sqsub -np ' + var1 + '/homedir/anotherdir/executable', shell=True)

1
投票

这里有很多好的答案,但你应该不惜一切代价避免使用shell=True将不受信任的变量传递给子进程,因为这是一个安全风险。变量可以转义到shell并运行任意命令!如果你无法避免它至少使用python3的shlex.quote()来转义字符串(如果你有多个空格分隔的参数,引用每个分裂而不是完整的字符串)。

shell=False始终是传递参数数组的默认值。

现在安全的解决方案......

方法#1

更改自己的进程环境 - 新环境将应用于python本身和所有子进程。

os.environ['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)

方法#2

制作环境的副本并传递给孩子。您可以完全控制子环境,不会影响python自身的环境。

myenv = os.environ.copy()
myenv['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command, env=myenv)

方法#3

仅限Unix:执行env以设置环境变量。如果你有许多变量需要修改而不是portabe会更麻烦,但是像#2那样你可以完全控制python和children环境。

command = ['env', 'LD_LIBRARY_PATH=my_path', 'sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)

当然,如果var1包含多个以空格分隔的参数,它们现在将作为带有空格的单个参数传递。要使用shell=True保留原始行为,您必须编写包含splitted字符串的命令数组:

command = ['sqsub', '-np'] + var1.split() + ['/homedir/anotherdir/executable']

-1
投票

紧凑型解决方案(假设您不需要其他环境变量):

call('sqsub -np {} /homedir/anotherdir/executable'.format(var1).split(),
      env=dict(LD_LIBRARY_PATH=my_path))

使用env命令行工具:

call('env LD_LIBRARY_PATH=my_path sqsub -np {} /homedir/anotherdir/executable'.format(var1).split())
© www.soinside.com 2019 - 2024. All rights reserved.