Как прочитать значение argv без экранирования строки? - PullRequest
2 голосов
/ 13 мая 2011

Я пишу скрипт на языке Python flac2m4a , который вызывает ffmpeg для преобразования файла .flac в файл .m4a.основная программа выглядит следующим образом:

cmd = "ffmpeg -i %s -acodec alac %s.m4a" % (sys.argv[1], sys.argv[1][:-5])
os.system(cmd)

Я могу использовать программу так:

./flac2m4a path_to_the_song.flac  

Но когда я запускаю ее для некоторых песен со специальными символами в названии:

./flac4m4a.py Justin\ Bieber\ -\ Never\ Say\ Never\ -\ The\ Remixes/01\ -\ Never\ Say\ Never\ \(feat.\ Jaden\ Smith\).flac

в linux, когда я нажимаю tab для автозаполнения, специальные символы будут экранированы с помощью \, но когда я прочту его из sys.argv[1], они будут преобразованы в обычную строку Python:

Justin Bieber - Never Say Never - The Remixes/01 - Never Say Never (feat. Jaden Smith).flac

Так что я просто хочу знать, как читать argv[1] точно так же, как то, что пользовательский ввод (с этими \)

Ответы [ 3 ]

6 голосов
/ 13 мая 2011

Хотя можно заключить в кавычки строку для оболочки, вы не должны использовать оболочку для выполнения вашей команды, что делает ненужным любое цитирование.Используйте subprocess.call() вместо os.system():

subprocess.call(["ffmpeg", "-i", sys.argv[1], "-acodec", "alac",
                 sys.argv[1][:-5] + ".m4a"])
1 голос
/ 13 мая 2011

То, что вы буквально просите, невозможно, потому что то, что набрано в командной строке, теряется, когда оболочка выполняет синтаксический анализ.Оболочка анализирует специальные символы и передает результат в python.К тому времени, когда питон получает строку, все специальные символы уже обработаны и выброшены.То есть, это не ошибка bash, а дизайн bash (и большинства других оболочек).

0 голосов
/ 13 мая 2011

. / Flac4m4a.py Джастин \ Бибер \ - \ Никогда \ Скажи \ Никогда \ - \ The \ Remixes / 01 \ - \ Никогда \ Скажи \ Никогда \ (feat. \ Jaden \ Smith) .flac

Команда '\' в приведенной выше команде используется для экранирования '', '(' и ')', то есть она равна

. / Flac4m4a.py 'Джастин Бибер - Никогда не говори никогда - Ремиксы / 01 - Никогда не говори никогда (feat. Jaden Smith) .flac '

Ваша программа на python никогда не увидит' \ 'в своем argv [1].

Если вам действительно нужны '\' перед каждым '', '(' и ')', вы можете легко добавить его в свою программу на python.

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