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 если не нужно.

Другие вопросы по тегам