首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用通配符从Python Popen调用'mv‘

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

Stack Overflow用户
提问于 2011-09-17 05:14:33
回答 3查看 3.6K关注 0票数 3

我似乎无法在Python subprocess.Popen中使用通配符来执行'mv‘命令。

代码:

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
    ['mv', '/full_path_to_folder_source/*.nib', '/full_path_to_folder_target/']

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

代码语言:javascript
复制
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

我读到为了使通配符起作用,我需要在Popen调用中使用参数shell=True,这个参数已经存在。你知道为什么这个不起作用吗?删除shell=True最终会像预期的那样将星号视为硬文字。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-17 05:17:58

使用字符串而不是数组:

代码语言:javascript
复制
params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/"

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

票数 9
EN

Stack Overflow用户

发布于 2011-09-17 05:36:24

您可以使用模块shutil和glob在不启动新进程的情况下完成此操作:

代码语言:javascript
复制
import glob
import shutil

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

Stack Overflow用户

发布于 2011-09-17 05:18:44

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7450456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档