开发者

Calling 'mv' from Python Popen with wildcard

I can't seem to get the 'mv' command to work from Python subprocess.Popen with a wildcard.

The code:

def moveFilesByType(source, destination, extension):
    params = [] 
    params.append("mv")
    params.append(source + "/*." + extension)       
    params.append(destination + "/") 

    print params

    pipe = subprocess.Popen(params, shell=True, stdout=PIPE)
    result, err = pipe.communicate()

    return result

The output from print params:

    ['mv', '/full_path_to_folder_source/*.nib', '/full_path_to_folder_target/']

The paths here are shortened just for readability, but I assure that they are valid. Calling this exact same command from a terminal works but calling in python gives the standard message about improper use of mv:

usage: mv [-f | -i 开发者_高级运维| -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

I read that in order for wildcards to work, I would need the parameter shell=True in the Popen call, which is present. Any ideas why this doesn't work? Removing shell=True ends up treating the asterisks as hard literals as expected.


Use a string instead of an array:

params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/"

When you specify arguments via the array form, the argument '/full_path_to_folder_source/*.nib' is passed to mv. You want to force bash to expand the argument, but Popen won't pass each argument through the shell.


You can do it without starting a new process using modules shutil and glob:

import glob
import shutil

def moveFilesByType(source, destination, extension):
    for path in glob.glob(source + "/*." + extension):
        shutil.move(path, destination)


You shouldn't need to use subprocess for this, check out shutil.copytree

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜