Использование glob для генерации аргументов с помощью subprocess.run () - PullRequest
0 голосов
/ 18 мая 2018

Я хочу использовать команду metaflac (https://linux.die.net/man/1/metaflac) из скрипта Python.

from subprocess import run

flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac"
run(['metaflac', '--add-replay-gain', flac_files])

Я получаю

The FLAC file could not be opened.  Most likely the file does not exist

или не читаем.

если я добавлю shell = True в функцию run, я получу:

ERROR: you must specify at least one FLAC file;
   metaflac cannot be used as a pipe

Так что же я делаю не так? Спасибо!

PS: конечно, команда работает нормальнов оболочке:

metaflac --add-replay-gain /home/fricadelle/Artist\ -\ Album \(2008\)/*.flac

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Если вы не укажете shell=True (и в первом приближении вы никогда не должны указывать shell=True), аргументы, которые вы предоставляете, передаются как есть, без расширений оболочки, разделения слов и разделения строк.Таким образом, имя файла, которое вы передаете в качестве аргумента, точно /home/fricadelle/Artist - Album (2008)/*.flac, что не является именем какого-либо файла.(Вот почему вам не нужно добавлять обратную косую черту перед пробелами и скобками. Если вы указали shell=True - и я повторяю, вам действительно следует избегать этого - тогда вам нужно будет включить обратную косую черту, чтобы оболочка неразделите имя на несколько разных слов.)

Когда вы набираете flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac без кавычек в оболочке, оболочка попытается расширить ее до списка всех файлов, имена которых соответствуют шаблону, и затем передастэтот список в качестве отдельных аргументов.Поскольку subprocess.run не делает этого, вам придется делать это самостоятельно, что вы обычно делаете с glob.glob.Например,

from subprocess import run
from glob import glob
flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac"
run(['metaflac', '--add-replay-gain'] + glob(flac_files))

Примечание: в отличие от оболочки, glob.glob вернет пустой список, если шаблон не соответствует ни одному файлу.Вы действительно должны проверить эту ошибку, а не вызывать metaflac без параметров имени файла.

0 голосов
/ 18 мая 2018

См. Ответ здесь для лучшего объяснения.

Глобирование не работает так, как вы ожидаете, вам нужно указать shell=True, но тогда вам нужно будет удалить список.

run('metaflac --add-replay-gain ' + flac_files, shell=True)

Должен сделать свое дело.

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