在python脚本中设置环境变量

2024-05-23 21:02:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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_路径

我怎样才能解决这个问题

谢谢你的帮助

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


Tags: path命令脚本bashmynplibrary环境变量
3条回答

狂欢节:

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"))

这里有很多很好的答案,但是您应该不惜一切代价避免使用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和子环境

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

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

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

可以通过使用将元素添加到环境中

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

并在shell(使用os.environ)中使用

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

相关问题 更多 >