gpt4 book ai didi

python - 为什么 tar 在使用 * 通配符的情况下通过 Python 的 subprocess.call 调用时无法创建存档?

转载 作者:行者123 更新时间:2023-12-01 07:24:28 25 4
gpt4 key购买 nike

我正在编写一个 python 脚本,该脚本应该从现有文件中提取一些数据,然后将原始文件打包到几个 tarball 中。文件名格式如下所示:

system_yymmddT0000.zip

其中 system 可以是多个名称之一,YYMMDDThhmm 是创建日期和时间。

为了实现此目的,我通过 Python 的 subprocess.call 使用 tar,因此,对于以日期 1704 开头的文件(例如 SAP_1704T0000.zip),命令为:

subprocess.call(["tar", "-cvf", "SAP_2017_04.tar", "SAP_1704*", "1>", "SAP_2017_04.filelist"])

但是,当我运行此脚本时,出现以下错误:

tar: SAP_1704*: Cannot stat: No such file or directory
tar: 1>: Cannot stat: No such file or directory
tar: SAP_2017_04.filelist: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

我还尝试将所有参数打包在一起,如下所示:

subprocess.call(["tar", "-cvf SAP_2017_04.tar SAP_1704* 1> SAP_2017_04.filelist"]) (参数之间没有逗号)。但是,然后我收到以下错误:

tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.

我无法弄清楚我做错了什么,因为手动在文件夹内导航并运行命令 tar cvf SAP_2017_04.tar SAP_1704* 1> SAP_2017_04.filelist
工作得很好。

最佳答案

通配符不由 tar 处理,它们需要由调用它的程序处理。 通常,该程序是一个 shell。

但是,它不一定是这样;通过在 native Python 中完成工作而不是使用 shell=True,您可以获得更安全的操作(如果您的任何参数是用户可配置的):

subprocess.call(['tar', '-cvf', 'SAP_2017_04.tar'] + glob.glob('SAP_1704*'),
stdout=open('SAP_2017_04.filelist', 'w'))
  • 我们使用 1>somefile(一条指令给你的 shell 来重定向 stdout,FD 1,写入 somefile) stdout=open('somefile', 'w') 告诉 Python 同样的事情。
  • 我们不是直接将 SAP_1704* 直接放入命令行,而是在 Python 中调用 glob.glob('SAP_1704*'),并将其返回的列表添加到参数列表。

关于python - 为什么 tar 在使用 * 通配符的情况下通过 Python 的 subprocess.call 调用时无法创建存档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com