在Python Popen中使用通配符调用'mv

3 投票
3 回答
3880 浏览
提问于 2025-04-17 02:28

我在用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

我了解到,要让通配符正常工作,我需要在 Popen 的调用中加上参数 shell=True,而这个参数是有的。你们觉得为什么这样还是不行呢?如果去掉 shell=True,那么星号就会被当作普通字符处理,这也是预期中的结果。

3 个回答

1

你不需要使用子进程来做这个,看看shutil.copytree这个工具吧。

3

你可以不需要启动一个新进程,直接使用shutil和glob这两个模块来完成这个任务:

import glob
import shutil

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

用字符串代替数组:

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

当你通过数组的方式指定参数时,参数 '/full_path_to_folder_source/*.nib' 会被传递给 mv 命令。你想让 bash 自动展开这个参数,但 Popen 不会把每个参数都通过 shell 传递。

撰写回答