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
相关产品推荐
相关产品推荐

