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

Jon*_*Jon 3 python unix shell scripting

我似乎无法subprocess.Popen使用通配符从Python中使用'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
Run Code Online (Sandbox Code Playgroud)

输出来自print params:

    ['mv', '/full_path_to_folder_source/*.nib', '/full_path_to_folder_target/']
Run Code Online (Sandbox Code Playgroud)

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

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
Run Code Online (Sandbox Code Playgroud)

我读,为了让通配符来工作,我需要的参数shell=TruePopen调用,这是存在的.任何想法为什么这不起作用?删除shell=True最终将星号视为预期的硬文字.

Foo*_*Bah 9

使用字符串而不是数组:

params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/"
Run Code Online (Sandbox Code Playgroud)

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

  • 在数组参数形式中,只有第一个参数通过shell传递.其他参数按原样传递,而`mv`没有globbing的概念 (2认同)