Здесь есть много хороших ответов, но вы должны любой ценой избегать передачи ненадежных переменных в подпроцесс, используя shell=True
как , это риск для безопасности .Переменные могут выходить в оболочку и запускать произвольные команды!Если вы просто не можете избежать этого, по крайней мере используйте shlex.quote()
в python3 для экранирования строки (если у вас есть несколько разделенных пробелом аргументов, заключите в кавычки каждый сплит вместо полной строки).
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']