2017-01-07 4 views
2

Я пытаюсь преобразовать файл с .m4a в .mp3 с помощью ffmpeg, и мне нужно получить доступ к папке с музыкой.Как избежать пробела в имени пути с помощью подпроцесса?

Имя путь этой папки: C:\\Users\A B\Desktop\Music

Я не могу получить доступ к нему с subprocess.call(), потому что только C:\\Users\A получает признание. Пробел не обрабатывается.

Вот мой питон скрипт:

import constants 
import os 
import subprocess 

path = 'C:\\Users\A B\Desktop\Music' 

def main(): 

files = sorted(os.listdir(path), key=lambda x: os.path.getctime(os.path.join(path, x))) 
if "Thumbs.db" in files: files.remove("Thumbs.db") 

for f in files: 
    if f.lower()[-3:] == "m4a": 
     process(f) 

def process(f): 
inFile = f 
outFile = f[:-3] + "mp3" 

subprocess.call('ffmpeg -i {} {} {}'.format('C:\\Users\A B\Desktop\Music', inFile, outFile)) 

main() 

Когда я запускаю его я получаю сообщение об ошибке, которое утверждает:

C: \ Users \ A: Нет такого файла или каталога

Интересно, знает ли кто-нибудь, как указать полное имя пути (C:\Users\A B\Desktop\Music) в subprocess.call()?

ответ

4

Заблаговременно редактировать: пробелы или нет, следующая командная строка -i <directory> <infilename> <outfilename> является не правильно для ffmpeg, так как он ожидает, что файл -i вариант, то входной файл и вывода, а не каталог первого. Таким образом, у Вас есть больше чем одна проблема здесь (что объясняет «доступ запрещен» сообщение, которое вы имели, потому что ffmpeg пытается открыть каталог в виде файла!)

Я полагаю, что вы хотите:

  • прочитать все файлы из каталога
  • преобразовать их все в файл, расположенный в том же каталоге

в этом случае, вы можете добавить кавычки, чтобы ваши оба входных & выходных абсолютных файлов, как это:

subprocess.call('ffmpeg -i "{0}\{1}" "{0}\{2}"'.format('C:\\Users\A B\Desktop\Music', inFile, outFile)) 

Это будет работать, но это не самое лучшее, что нужно сделать: не очень производительный, используя format, когда у вас уже есть все аргументы уже, вы не можете иметь знания других персонажей, чтобы избежать, и т.д. ... не изобретать велосипед.

Лучший способ сделать это, чтобы передать аргументы в списке так subprocess модуль обрабатывает кавычки/спасаясь при необходимости:

path = r'C:\Users\A B\Desktop\Music' # use raw prefix to avoid backslash escaping 
subprocess.call(['ffmpeg','-i',os.path.join(path,inFile), os.path.join(path,outFile)]) 

стороне: если вы пользователь в вопросе, это даже лучше делать:

path = os.getenv("USERPROFILE"),'Desktop','Music' 

и вы можете даже запустить процесс в каталоге path с cwd вариант:

subprocess.call(['ffmpeg','-i',inFile, outFile],cwd=path) 

и если вы не убедитесь, чтобы запустить сценарий с повышенными привилегиями или вы не получите доступ к другой директории пользователя (защищенный для чтения)

+0

Вы знаете, почему я получил C: \ Пользователи \ AB \ Desktop \ Music: запрещено разрешение? – akasimov

+0

aaah это еще одна история: в окнах вы не можете посетить другой профиль пользователя, если вы не администратор (открытие повышенной оболочки будет способом, если у вас есть эти привилегии) ​​ –

+0

Странно, я администратор нет другого профиля пользователя – akasimov

Смежные вопросы