这里有很多好的答案,但您应该尽可能避免使用 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)
第三种方法
仅适用于Unix系统:执行env
以设置环境变量。如果你有多个变量要修改,这种方法会更加繁琐并且不太便携,但是和方法二一样,你可以完全控制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']