我有一个bash脚本,用于设置环境变量并运行命令
LD_LIBRARY_PATH=my_path
sqsub -np $1 /homedir/anotherdir/executable
Run Code Online (Sandbox Code Playgroud)
现在我想使用python而不是bash,因为我想计算一些我传递给命令的参数.
我试过了
putenv("LD_LIBRARY_PATH", "my_path")
Run Code Online (Sandbox Code Playgroud)
和
call("export LD_LIBRARY_PATH=my_path")
Run Code Online (Sandbox Code Playgroud)
其次是
call("sqsub -np " + var1 + "/homedir/anotherdir/executable")
Run Code Online (Sandbox Code Playgroud)
但是程序总是放弃,因为没有设置LD_LIBRARY_PATH.
我怎样才能解决这个问题?
感谢帮助!
(如果我在调用python脚本之前导出LD_LIBRARY_PATH一切正常,但我希望python确定路径并将环境变量设置为正确的值)
jfs*_*jfs 56
庆典:
LD_LIBRARY_PATH=my_path
sqsub -np $1 /path/to/executable
Run Code Online (Sandbox Code Playgroud)
类似,在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"))
Run Code Online (Sandbox Code Playgroud)
Man*_*rdo 12
您可以使用添加元素到您的环境
os.environ['LD_LIBRARY_PATH'] = 'my_path'
Run Code Online (Sandbox Code Playgroud)
并使用在shell(使用您的os.environ)中运行子进程
subprocess.call('sqsub -np ' + var1 + '/homedir/anotherdir/executable', shell=True)
Run Code Online (Sandbox Code Playgroud)
这里有很多好的答案,但是您应该不惜一切代价避免将不可信的变量传递给子进程,shell=True因为这存在安全风险。变量可以转义到shell并运行任意命令!如果您无法避免,请至少使用python3 shlex.quote()来转义字符串(如果您有多个以空格分隔的参数,请使用每个分隔符而不是完整的字符串)。
shell=False 始终是传递参数数组的默认位置。
现在,安全的解决方案...
更改自己的进程的环境-新的环境将适用于python本身和所有子进程。
os.environ['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)
Run Code Online (Sandbox Code Playgroud)
复制环境并传递给孩子。您完全可以控制子环境,并且不会影响python自己的环境。
myenv = os.environ.copy()
myenv['LD_LIBRARY_PATH'] = 'my_path'
command = ['sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command, env=myenv)
Run Code Online (Sandbox Code Playgroud)
仅限env于Unix:执行以设置环境变量。如果您要修改的变量很多而不是portabe,则比较麻烦,但是像#2一样,您可以完全控制python和子级环境。
command = ['env', 'LD_LIBRARY_PATH=my_path', 'sqsub', '-np', var1, '/homedir/anotherdir/executable']
subprocess.check_call(command)
Run Code Online (Sandbox Code Playgroud)
当然,如果var1包含多个以空格分隔的参数,则它们现在将作为带有空格的单个参数传递。要保留原始行为,shell=True必须组成一个包含分割字符串的命令数组:
command = ['sqsub', '-np'] + var1.split() + ['/homedir/anotherdir/executable']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
147063 次 |
| 最近记录: |