在子进程中使用*通配符的命令的问题

2024-09-26 18:08:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用子进程库和Popen方法将文件从一个位置复制到另一个位置。运行以下脚本时,我得到错误cp: cannot stat /some/dev_path/*。我被告知*没有扩展到文件名,这就是问题所在。在其他一些帖子中,有人建议使用call而不是Popen,但据我所知,call不会返回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)

Tags: 文件path方法dev进程stderrsomecall
1条回答
网友
1楼 · 发布于 2024-09-26 18:08:48

展开*(globbing)是shell的一个函数,例如bash。因此,您必须在subprocess.Popen调用中使用关键字参数shell=True。在

但是,对于这种情况,我强烈建议使用shutil.copytree。在

(首先,因为它简单得多(参见Zen of Python),而且不容易出错。处理错误要简单得多,您可以得到一些不错的异常,包括错误列表(对于像您这样的多文件操作),而且您不必处理生成子进程和与之通信的问题。第二,如果不需要的话,分叉子进程是不必要的资源浪费。其他问题包括引用/转义,如果未能正确清理用户输入,则可能在代码中引入安全漏洞。)

例如:

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

另外,您不应该通过串联字符串来构建文件系统路径,而应该使用os.path.join()。这将为当前操作系统使用正确的目录分隔符(os.sep),并允许您轻松编写可移植代码。在

示例:

^{pr2}$

注意:os.path.join仍然只进行(智能)字符串操作-它不关心该路径是否可访问甚至存在。在

相关问题 更多 >

    热门问题