WSL子系统无法定位FastAPI上传的图片文件问题排查
问题原因及解决办法
1. 字符串变量未正确替换
你在subprocess.run调用里用了'{img1.filename}'这种写法,这不是有效的变量注入,WSL收到的是字面字符串{img1.filename},而非实际的文件名。必须用f-string完成变量替换,同时要去掉参数里的多余空格(避免命令解析出错):
错误代码:
subprocess.run(['wsl','./process', '-m', ' 1 ', ' -L ', '{img1.filename}' ,' -R ','{img2.filename}'])
修正后:
subprocess.run(['wsl','./process', '-m', '1', '-L', f"{img1.filename}", '-R', f"{img2.filename}"])
2. WSL与Windows的路径不兼容
Windows的文件路径和WSL的文件系统映射规则不同——你在Windows下把图片存在项目根目录,但WSL无法直接识别Windows的相对路径。需要把Windows的绝对路径转换成WSL格式:
先添加路径转换函数,再修改保存和调用逻辑:
def windows_to_wsl_path(windows_path): # 把Windows路径转成WSL格式,比如C:\project\1.png → /mnt/c/project/1.png drive, rest = windows_path.split(':', 1) return f"/mnt/{drive.lower()}{rest.replace('\\', '/')}" # 保存图片时先获取绝对路径 img1_path = os.path.abspath(img1.filename) with open(img1_path, "wb") as buffer: shutil.copyfileobj(img1.file, buffer) img2_path = os.path.abspath(img2.filename) with open(img2_path, "wb") as buffer: shutil.copyfileobj(img2.file, buffer) # 转换为WSL可识别的路径 wsl_img1 = windows_to_wsl_path(img1_path) wsl_img2 = windows_to_wsl_path(img2_path) # 调用WSL时使用转换后的路径 subprocess.run(['wsl','./process', '-m', '1', '-L', wsl_img1, '-R', wsl_img2])
3. 工作目录不匹配
subprocess.run默认使用当前Python进程的工作目录,但WSL执行时的工作目录可能不是你的项目根目录,导致找不到./process文件。可以直接用绝对路径调用process:
# 获取process的绝对路径并转成WSL格式 process_path = os.path.abspath("./process") wsl_process_path = windows_to_wsl_path(process_path) subprocess.run(['wsl', wsl_process_path, '-m', '1', '-L', wsl_img1, '-R', wsl_img2])
4. 异常信息缺失调试细节
当前异常捕获只返回模糊的"Internal server error",不利于排查问题。可以把具体错误信息返回:
except Exception as e: raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
内容的提问来源于stack exchange,提问作者tnguyen
相关产品推荐
相关产品推荐

