我似乎无法使用通配符从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
我读到为了使通配符正常工作,我需要在shell=True
调用中存在参数Popen
。任何想法为什么这不起作用?删除shell=True
最终会将星号视为预期的硬文字。
答案 0 :(得分:9)
使用字符串而不是数组:
params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/"
当您通过数组表单指定参数时,参数'/full_path_to_folder_source/*.nib'
将传递给mv
。您希望强制bash扩展参数,但Popen
不会通过shell传递每个参数。
答案 1 :(得分:3)
您可以在不使用模块shutil和glob:
启动新进程的情况下执行此操作import glob
import shutil
def moveFilesByType(source, destination, extension):
for path in glob.glob(source + "/*." + extension):
shutil.move(path, destination)
答案 2 :(得分:1)
您不需要为此使用子流程,请查看shutil.copytree