Подпроцесс Python как передать аргумент subshell - PullRequest
0 голосов
/ 15 января 2019

Я делаю сценарий, используя SoX для объединения нескольких аудиофайлов вместе.

Эта команда работает в терминале

sox &(ls *.mp3) out.mp3

но если я попытаюсь использовать его внутри скрипта Python, вызвав subprocess.run (), это не

subprocess.run(['sox', '$(ls *.mp3)', 'out.mp3'])

> sox FAIL formats: can't open input file `$(ls *.mp3)': No such file or
> directory

Я представляю, что это из-за операции subshell, но я не знаю, как правильно ее передать. Я также попытался, как и в каком-то другом посте, передать аргумент shell=True, но затем он говорит

> sox FAIL sox: Not enough input filenames specified

Я нахожусь в том же рабочем каталоге, и я также попытался указать полный путь, но он тоже не работает.
Я мог бы просто написать сценарий bash и вызвать его, но я хотел бы знать, как справиться в этом сценарии с Python.

1 Ответ

0 голосов
/ 15 января 2019

вы хотите использовать shell=True, чтобы заставить subprocess выполнить вашу команду через интерпретатор оболочки и проанализировать подстановочные знаки / подкоманды. Однако это (в зависимости от платформы) предполагает, что аргумент передается как строка , а не как список параметров. Множество ограничений для ленивого и небезопасного способа сделать это.

Подождите. Вы можете сделать без shell=True, используя glob.glob:

subprocess.run(['sox'] + glob.glob('*.mp3') + ['out.mp3'])

Было бы лучше проверить, действительно ли являются mp3 файлами в текущей папке, так:

input_files = glob.glob('*.mp3')
if input_files:
   subprocess.run(['sox'] + input_files + ['out.mp3'])
else:
    raise Exception("No mp3 files")

если вы получите сообщение "No mp3 files", проверьте текущий каталог. Всегда полезно использовать параметр для входного каталога и избегать использования текущего каталога (glob.glob(os.path.join(input_directory,'*.mp3')))

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