使用通配符从Python Popen调用'mv'

时间:2011-09-16 21:14:33

标签: python shell unix scripting

我似乎无法使用通配符从Python subprocess.Popen获取'mv'命令。

代码:

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

print params的输出:

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

这里的路径只是为了便于阅读而缩短,但我保证它们是有效的。从终端调用这个完全相同的命令可以工作但是在python中调用会给出关于mv的不当使用的标准消息:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

我读到为了使通配符正常工作,我需要在shell=True调用中存在参数Popen。任何想法为什么这不起作用?删除shell=True最终会将星号视为预期的硬文字。

3 个答案:

答案 0 :(得分:9)

使用字符串而不是数组:

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

当您通过数组表单指定参数时,参数'/full_path_to_folder_source/*.nib'将传递给mv。您希望强制bash扩展参数,但Popen不会通过shell传递每个参数。

答案 1 :(得分:3)

您可以在不使用模块shutil和glob:

启动新进程的情况下执行此操作
import glob
import shutil

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

答案 2 :(得分:1)

您不需要为此使用子流程,请查看shutil.copytree