【问题标题】:Calling 'mv' from Python Popen with wildcard使用通配符从 Python Popen 调用“mv”
【发布时间】:2011-11-19 00:15:33
【问题描述】:

我似乎无法使用通配符从 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 最终会将星号视为预期的硬文字。

【问题讨论】:

  • 当然shutil.copytree是更好的选择,你也可以使用glob在shell环境中实现通配符的类似功能。

标签: python shell unix scripting


【解决方案1】:

使用字符串代替数组:

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

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

【讨论】:

  • 这行得通,但你知道为什么必须这样做吗?在subprocess.Popen 的其他用途中,我使用数组传递参数。
  • 在数组参数形式中,只有第一个参数通过外壳传递。其他参数按原样传递,mv 没有通配的概念
【解决方案2】:

您无需使用模块 shutil 和 glob 就可以做到这一点:

import glob
import shutil

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

【讨论】:

  • 好吧,之后你还是要删除文件。为此,您必须检查副本是否有效。调用 mv 确实使这更容易......
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 2014-09-03
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多