Madno
Madno

Reputation: 910

How to treat whitespace in bash via Python?

I am trying to run the ffmpeg command to record the screen using the subprocess module. Everything is fine with this line:

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

GivenPathAndName is something like file:///home/user/Videos/test.mp4. As I said, it's working. (It is in this form because I am getting the folder URI from a GTK widget).

However, the problem is when I select a folder with a white spaces. Like file:///home/user/Documents/New Folder. This will give me the following error in terminal:

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

I know that this is because of bash misinterpreting the whitespace. And that I can actually run it with putting \ before the whitespace to solve it. However, I couldn't manage to find a way to do that from Python sending it to Bash.

Upvotes: 0

Views: 73

Answers (1)

kiecodes
kiecodes

Reputation: 1659

There is nothing about the bash or python in cooperation with the bash. Here is a little example that shows that:

import sys
import os

for arg in sys.argv:  
    print arg

Starting this little script with the bash it'll give you the following:

$ ./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

And to be sure about the file://.

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

So the problem must be with how you get GivenPathAndName from your script or other parts of the program. In order to decode this url encoding use urllib.parse.unquote() for Python3 or urllib.unquote() for Python2.

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

Upvotes: 1

Related Questions