如何在Python subprocess模块中使用通配符执行文件复制命令?
解决subprocess执行cp通配符报错问题
你遇到的报错是因为subprocess默认不会让shell解析通配符,plot*会被当成一个字面文件名传递给cp,而系统中不存在名为plot*的文件,所以触发"No such file or directory"错误。直接指定完整文件名时,参数是真实存在的文件,因此命令能正常执行。
以下是两种可行的解决方法:
方法1:启用shell解析通配符
给subprocess.run()添加shell=True参数,让shell负责展开通配符,同时可以将命令写成字符串形式(更符合shell执行习惯):
copyfiles = subprocess.run('cp -r plot* dest', shell=True)
注意:如果命令中包含用户输入的内容,shell=True可能存在命令注入风险,但此处是固定通配符,无需担忧。
方法2:用Python模块手动匹配文件(更安全)
使用glob模块匹配符合规则的文件,再将匹配结果作为参数传给cp命令,这种方式不依赖shell,安全性更高。如果需要精确匹配"plot开头+8位数字"的文件,可结合正则过滤:
import glob import re import subprocess # 匹配所有以plot开头的文件,再过滤出后跟8位数字的文件 matched_files = [ file for file in glob.glob('plot*') if re.fullmatch(r'plot\d{8}', file) ] if matched_files: # 将匹配到的文件列表拼入cp命令参数 copyfiles = subprocess.run(['cp', '-r'] + matched_files + ['dest']) else: print("未找到符合条件的文件")
如果不需要精确匹配8位数字,仅匹配plot*,直接用glob.glob('plot*')即可。
内容的提问来源于stack exchange,提问作者Vinoth Paramanantham
相关产品推荐
相关产品推荐

