Python subprocess.check_output(args) завершается ошибкой, а аргументы, выполняемые через командную строку Windows, работают нормально
Некоторые проблемы с python subprocess.check_output.
output = subprocess.check_output(args)
где моя args
является:
args = "C:\\DO\\bin\\Config.exe --ChCfg7 --LFE -b1152000 C:\\DO\\PCM\\1.wav C:\\DO\\PCM\\2.wav C:\\DO\\PCM\\3.wav C:\\DO\\PCM\\4.wav C:\\DO\\PCM\\5.wav C:\\DO\\PCM\6.wav --ModeBCast -oC:\\DO\\OUT\\outfile > C:\\DO\\OUT\\log.txt
Это работает, когда выполняется из стандартной командной строки Windows, но не работает, когда выполняется через Python subprocess.check_output
, В случае win cmd создается выходной файл и log.txt, а скрипт python создает файл с размером 0 и без log.txt.
3 ответа
output = subprocess.check_output(args,shell=True)
Запустите это с shell=True
Используйте список аргументов и перенаправьте вывод в файл:
import subprocess
args = ['C:/DO/bin/Config.exe', '--ChCfg7', '--LFE', '-b1152000', 'C:/DO/PCM/1.wav', 'C:/DO/PCM/2.wav', 'C:/DO/PCM/3.wav', 'C:/DO/PCM/4.wav', 'C:/DO/PCM/5.wav', 'C:/DO/PCM/6.wav', '--ModeBCast', '-oC:/DO/OUT/outfile']
with open("C:/DO/OUT/log.txt", "w") as f:
subprocess.check_call(args, stdout=f)
Ты можешь использовать shell=True
но по соображениям безопасности, как правило, это не очень хорошая идея, и то же самое может быть легко достигнуто с помощью приведенного выше кода и простого перенаправления вывода в файл.
>
является оператором перенаправления оболочки Либо запустите команду в оболочке, либо (лучше), как @Padraic Cunningham предложил эмулировать ее в Python:
#!/usr/bin/env python
import subprocess
args = r"C:\DO\bin\Config.exe --ChCfg7 --LFE -b1152000".split()
args += [r'C:\DO\PCM\%d.wav' % i for i in range(1, 7)]
args += ["--ModeBCast", r"-oC:\DO\OUT\outfile"]
with open(r"C:\DO\OUT\log.txt", "wb", 0) as output_file:
subprocess.check_call(args, stdout=output_file)
Код использует необработанные строковые литералы для путей Windows, чтобы избежать обратной косой черты.
Обычно нет смысла использовать shell=True
в Windows, если вы не хотите запустить встроенную команду, такую как dir
, Если args
не создается с использованием входных данных из внешнего источника, поэтому соображения безопасности не применяются. shell=True
запускает дополнительный процесс (%COMSPEC%
) и он меняет способ поиска исполняемого файла и меняет, какие символы следует экранировать (какие символы являются метасимволами) - не используйте shell=True
если не нужно.