2017-02-02 3 views
0

Я пытаюсь запустить команду ffmpeg для записи экрана с помощью модуля subprocess. Все в порядке с этой линией:Как обрабатывать пробелы в bash через Python?

subprocess.Popen(["ffmpeg", "-video_size", GivenSizeOfScreen, "-framerate", GivenRateOfFrames, "-f", "x11grab", "-i", ":0.0", "-q", GivenQuality, GivenPathAndName]) 

что-то вроде file:///home/user/Videos/test.mp4. Как я уже сказал, он работает. (Это в этой форме, потому что я получаю URI папки из виджета GTK).

Однако проблема заключается в том, что я выбираю папку с пробелами. Мне нравится file:///home/user/Documents/New Folder. Это даст мне следующее сообщение об ошибке в терминале:

file:///home/user/Documents/New%20Folder/test.mp4: No such file or directory 

Я знаю, что это из-Баша искажая пропуска. И что я могу запустить его с помещением \ перед пробелом, чтобы его решить. Однако мне не удалось найти способ сделать это с Python, отправив его в Bash.

+0

не уверен, что это bash, так как вы не установили 'shell = True'. Можете ли вы попробовать без префикса 'file: //'? Я не понимаю, почему это не сработает. –

+0

Похоже, ffmpeg принимает URL-адреса, но эта поддержка глючит. Баш здесь вообще не участвует; процесс запускается непосредственно Python без промежуточной оболочки. –

+0

@ Jean-FrançoisFabre Я не хотел использовать shell = True, потому что это угроза безопасности. Удаление/установка файла: // ничего не изменило. – Madno

ответ

1

Ничего не найдено о bash или python в сотрудничестве с bash. Вот небольшой пример, который показывает, что:

import sys 
import os 

for arg in sys.argv: 
    print arg 

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

$ ./arg_test.py this\ is\ a\ test 
./arg_test.py 
this is a test 

$ ./arg_test.py "this is a test" 
./arg_test.py 
this is a test 

И быть уверены в file://.

$ ./arg_test.py "file:///test test/" 
./arg_test.py 
file:///test test/ 

Таким образом, проблема должна быть с тем, как вы получаете от вашего скрипта или других частей программы. Чтобы декодировать эту кодировку URL, используйте urllib.parse.unquote() для Python3 или urllib.unquote() для Python2.

import urllib 
subprocess.Popen([ 
    "ffmpeg", 
    "-video_size", GivenSizeOfScreen, 
    "-framerate", GivenRateOfFrames, 
    "-f", "x11grab", 
    "-i", ":0.0", 
    "-q", GivenQuality, 
    urllib.parse.unquote(GivenPathAndName) 
]) 
Смежные вопросы