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

Python脚本调用subprocess执行stilts拼接FITS文件遇FileNotFoundError

问题原因及解决办法

核心原因

1. subprocess默认不启动shell,命令解析逻辑不同

用subprocess.call()直接传完整命令字符串时,默认会把整个字符串当作单个可执行文件的路径去查找,而非像终端那样交给shell拆分命令与参数。比如你写的stilts tcat in=*.fits out=combined.fits,subprocess会去寻找名为stilts tcat in=*.fits out=combined.fits的可执行文件,自然找不到。

2. 环境变量PATH不一致

终端的shell(比如bash)会加载~/.bashrc或~/.profile配置,把stilts的安装路径加入PATH;但Python脚本通过subprocess调用时,默认继承的环境变量可能未包含该路径,导致找不到stilts命令本身。

3. 路径或命令含特殊字符未处理

如果FITS文件路径包含空格、括号等特殊字符,直接传字符串给subprocess会被错误拆分,导致命令结构混乱,触发找不到命令的错误。

解决办法

方法一:添加shell=True参数

让shell来解析命令,直接适配终端的执行逻辑:

import subprocess

cmd = "stilts tcat in=/path/to/vvv_tiles_no_overlap/*.fits out=combined.fits"
subprocess.call(cmd, shell=True)

注:若命令涉及用户输入,shell=True存在安全风险,但你的场景处理固定路径文件,无需担心。

方法二:拆分命令为参数列表(更安全)

不要传完整命令字符串,拆分成列表形式,同时确保stilts路径正确:

import subprocess
import os

# 用`which stilts`在终端获取stilts的完整路径
stilts_path = "/usr/bin/stilts"
input_files = os.path.join(os.getcwd(), "vvv_tiles_no_overlap", "*.fits")
output_file = os.path.join(os.getcwd(), "vvv_tiles_no_overlap", "combined.fits")

cmd = [stilts_path, "tcat", f"in={input_files}", f"out={output_file}"]
subprocess.call(cmd)

方法三:传递终端完整环境变量

把终端的环境变量传给subprocess,确保能找到stilts:

import subprocess
import os

env = os.environ.copy()
cmd = "stilts tcat in=vvv_tiles_no_overlap/*.fits out=vvv_tiles_no_overlap/combined.fits"
subprocess.call(cmd, shell=True, env=env)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:52:24