Просто заметка. shell=True
, вероятно, было правильным решением o.p., так как они не сделали следующую ошибку, но вы также можете получить ошибку «Нет такого файла или каталога», если вы не отделите свой исполняемый файл от его аргументов.
import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2
Без shell=True
Попен ожидает, что исполняемый файл будет первым элементом аргументов, поэтому он терпит неудачу, исполняемого файла "echo 1" нет. Добавление shell=True
вызывает вашу системную оболочку и передает первый элемент args
в оболочку. то есть для linux Popen(['echo 1'], shell=True)
эквивалентно Popen('/bin/sh', '-c', 'echo 1')
, что требует больше затрат, чем вам может понадобиться. См. Popen () документацию для случаев, когда shell=True
действительно полезен.