You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用subprocess.check_call执行带通配符的ls命令报错如何解决?

问题原因分析

这个问题的核心在于shell通配符的解析时机:

当你使用split()把命令字符串拆成列表传给subprocess.check_call()时,默认情况下subprocess不会启动系统shell,而是直接把列表里的每个元素作为参数传给ls命令。这时候*会被当成一个字面量的文件名——系统里根本不存在叫/home/user/nse*的文件,所以ls会返回错误状态码2,触发CalledProcessError。

加单引号的做法更糟:'/home/user/nse*'会被当成一个完整的带引号的文件名,系统同样找不到它,自然也会报错。

解决方案

这里有两种常用的解决思路,根据你的场景选择:

方法一:让shell处理通配符(简单但注意安全)

如果你只是执行固定的、无用户输入的命令,可以开启shell=True参数,让系统shell来解析通配符。这时候直接传完整的命令字符串即可,不需要split():

import subprocess
subprocess.check_call("ls -l /home/user/nse*", shell=True)

⚠️ 注意:如果命令中包含用户提供的动态内容,绝对不要用这种方法——会存在shell注入的安全风险,比如用户输入恶意命令片段会被执行。

方法二:用Python的glob模块解析通配符(更安全)

如果需要避免shell风险,或者要自己控制通配符解析逻辑,可以用Python标准库的glob模块先解析通配符,得到匹配的文件列表,再传给subprocess:

import subprocess
import glob

# 先解析通配符,得到所有匹配的文件路径
matching_files = glob.glob("/home/user/nse*")

if matching_files:
    # 把文件列表作为参数传给ls
    subprocess.check_call(["ls", "-l"] + matching_files)
else:
    print("没有匹配到任何文件")

这种方式完全由Python处理通配符解析,不需要启动shell,安全性更高,适合生产环境或者处理用户输入的场景。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:47:45