在Python Popen中使用通配符调用'mv
我在用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 传递。