为什么Python3 Popen不能使用通配符来复制文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (210)

在尝试将一组文件从一个目录复制到另一个目录时,我有一些代码

>>> cpCmd = ["cp", blogdir + "/*.log", thisdir+"/."]
>>> cpCmd
['cp', '/Volumes/Data/abcd/boards/*.log', './.']
>>> cProc = subprocess.Popen(cpCmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> (cOut, cErr) = cProc.communicate()
>>> cExitCode = cProc.wait()
>>> cExitCode
1
>>> print(cErr.decode('ascii').rstrip())
cp: /Volumes/Data/abcd/aging_logs/boards/*.log: No such file or directory

但是,当日志文件位于远程主机上并且我使用时

scp user@host:dir_path/*.log local_dir

它工作得很好。在两种情况下python3如何与shell交互有区别吗?这是在MacOS 10.13.2上。谢谢。

提问于
用户回答回答于

在Python示例中,不涉及shell:Python cp直接执行。Globs仅由shell扩展,因此cp接收文字参数/Volumes/Data/abcd/aging_logs/boards/*.log并且不存在具有该名称的文件。

在这种scp情况下,*正在以scp相同的方式逐字传递,但scp正在扩展远程系统上的glob。这是一个特点scp

您可以使用该glob模块展开glob并将完整的文件名列表传递给cp。(您也可以使用Popenshell=True论点,但请注意文档中安全注意事项。)

扫码关注云+社区

领取腾讯云代金券