james_dean
james_dean

Reputation: 1517

Passing commands to OS: What is wrong here?

So, I want to create a simple script to create directories based upon the file names contained within a certain folder.

My method looks like this:

def make_new_folders(filenames, destination):
    """
    Take a list of presets and create new directories using mkdir
    """
    for filename in filenames:
        path = '"%s/%s/"' %  (destination, filename)
        subprocess.call(["mkdir", path])

For some reason I can't get the command to work.

If I pass in a file named "Test Folder", i get an error such as:

mkdir: "/Users/soundteam/Desktop/PlayGround/Test Folder: No such file or directory

Printing the 'path' variable results in: "/Users/soundteam/Desktop/PlayGround/Test Folder/"

Can anyone point me in the right direction?

Upvotes: 0

Views: 191

Answers (2)

Fabian
Fabian

Reputation: 4348

First of all, you should use os.path.join() to glue your path parts together because it works cross-platform.

Furthermore, there are built-in commands like os.mkdir or os.makedirs (which is really cool because it's recursive) to create folders. Creating a subprocess is expensive and, in this case, not a good idea.

In your example you're passing double-quotes ("destination/filename") to subprocess, which you don't have to do. Terminals need double-quotes if you use whitespaces in file or folder names, subprocess takes care of that for you.

Upvotes: 7

Marcelo Cantos
Marcelo Cantos

Reputation: 186058

You don't need the double quotes. subprocess passes the parameters directly to the process, so you don't need to prepare them for parsing by a shell. You also don't need the trailing slash, and should use os.path.join to combine path components:

path = os.path.join(destination, filename)

EDIT: You should accept @Fabian's answer, which explains that you don't need subprocess at all (I knew that).

Upvotes: 4

Related Questions