Python subprocess.check_call проблема - PullRequest
0 голосов
/ 13 декабря 2011

Я знаю, что делаю что-то не так.

В оболочке я бы набрал:

cuebreakpoints cuefile.cue | shnsplit -o flac flacfile.flac

Это затем разделит файл flac в соответствии с cuefile. Поскольку я нахожусь в процессе написания небольшого справочного инструмента (на Python) для преобразования файлов flac, я, очевидно, хотел включить этот бит в свой код.

Итак, по-питонски я написал:

for root, dirs, files in os.walk(args):
    ...
    cmd = ('cuebreakpoints', cue, '|', 'shnsplit', '-o', 'flac', flacs[0])
    subprocess.check_call(cmd, cwd=None)
    ....

'cue' - это файл cuefile, а 'flacs [0]' - файл flac. Однако я получаю:

subprocess.CalledProcessError: Команда '(' cuebreakpoints ',' 41_30sec.cue ',' | ',' shnsplit ',' -o ',' flac ',' 41_30sec.flac ')' вернула ненулевой статус выхода 1

Есть ли проблема из-за ТРУБЫ?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

В качестве альтернативы передаче командной строки в оболочку (и пропуска проблем безопасности, указанных larsmans), вы можете создать два объекта subprocess.Popen и подключить выход первого к входу второго ( это в основном то, что оболочка сделает для вас):

Пример того, как это сделать, приведен в разделе замена конвейера оболочки в документации.

2 голосов
/ 13 декабря 2011

Если вы хотите использовать функции оболочки, такие как каналы, вам нужно дать check_call a shell=True kwarg и дать команду в виде одной строки:

check_call("cuebreakpoints '%s' | shnsplit -o flac '%s'" % (cue, flacs[0]),
           shell=True)

Но учтите, что shell=True представляет собой потенциальную угрозу безопасности при использовании с неанизированными cue или flacs.

0 голосов
/ 13 декабря 2011

Небольшой знак здесь.

При написании сценариев Python с использованием подкоманды я считаю shlex действительно полезным для анализа более сложных команд, не слишком заботясь о том, как будет выглядеть список.

import shlex

...
cmd = "cuebreakpoints '%s' | shnsplit -o flac '%s'" % (cue, flacs[0])
args = shlex.split(cmd)

subprocess.call(args ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...