mar*_*oss 3 python subprocess glob copy cp
我正在尝试使用子进程库和Popen方法将文件从一个位置复制到另一个位置.运行以下脚本时,我收到错误cp: cannot stat /some/dev_path/*
.我被告知*
没有扩展到文件名,这就是问题所在.另外在其他一些帖子中,人们建议使用呼叫代替Popen,但据我所知,呼叫不会返回stderr.
devPath = '/some/dev_path/'
productionPath = '/some/prod_path/'
p = subprocess.Popen(['cp', '-r', devPath + '*', productionPath], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
pout, perr = p.communicate()
if perr != '':
sys.exit('Error: ' + perr)
Run Code Online (Sandbox Code Playgroud)
Luk*_*raf 13
扩展*
(globbing)是你的shell的函数,例如bash.因此,您必须shell=True
在subprocess.Popen
通话中使用关键字参数.
但是,对于这种情况,我强烈建议使用shutil.copytree.
(首先,因为它更简单(参见Python的Zen)并且不易出错.处理错误更加清晰,你会得到很好的例外,包括错误列表(对于像你这样的多文件操作),你不要必须处理产生子进程并与之通信.其次,如果你不需要,分叉子进程是不必要的资源浪费.其他问题包括引用/转义以及可能在你的代码中引入安全漏洞无法正确清理用户输入.)
例如:
from shutil import copytree
from shutil import Error
try:
copytree('dir_a', 'dir_b')
except (Error, OSError), e:
print "Attempt to copy failed: %s" % e
Run Code Online (Sandbox Code Playgroud)
此外,您不应该通过将字符串连接在一起来构建文件系统路径,而是使用os.path.join().这将为os.sep
当前操作系统使用正确的目录分隔符(),并允许您轻松编写可移植代码.
例:
>>> import os
>>> os.path.join('/usr/lib', 'python2.7')
'/usr/lib/python2.7'
Run Code Online (Sandbox Code Playgroud)
注意:os.path.join
仍然只进行(智能)字符串操作 - 它不关心该路径是否可访问或甚至存在.