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

Python中os.system执行长命令被截断致sh报错问题求助

解决shell命令解析拆分导致的-json: not found错误

最优解决方案:用subprocess.run()替代os.system()

os.system()依赖shell解析命令字符串,一旦路径或参数里包含空格、换行等特殊字符(你误以为的“文件名过长”大概率是这个原因),shell会错误拆分命令,把-json当成新命令执行。改用subprocess.run()直接传参数列表,完全避免这个问题:

import subprocess

# 参数按列表传递,每个选项/值单独成元素,无需手动拼接字符串
subprocess.run([
    "./xtool",
    "-l", f"./temp_files/{file1}",
    "-t", line,
    "-json",
    "-o", result_file
], check=True)  # check=True会在命令执行失败时抛出异常,方便调试

兼容旧代码的临时方案:用shlex.quote()转义参数

如果必须保留os.system(),需要对所有可能含特殊字符的变量进行shell安全转义:

import os
import shlex

# 对每个动态变量进行转义,避免shell解析错误
escaped_input = shlex.quote(f"./temp_files/{file1}")
escaped_line = shlex.quote(line)
escaped_output = shlex.quote(result_file)

cmd = f"./xtool -l {escaped_input} -t {escaped_line} -json -o {escaped_output}"
os.system(cmd)

关键原因说明

你的报错sh: 2: -json: not found本质是:shell把拼接后的命令字符串按空格/特殊字符拆分,原本属于同一个命令的-json被当成了新的独立命令执行。subprocess.run()的参数列表模式跳过了shell解析,直接把参数传递给xtool进程,从根源解决了这个问题。

内容的提问来源于stack exchange,提问作者Yahya Al Hattali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:18:19