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

Python使用subprocess.run调用mkdir在WSL1环境下报错问题咨询

问题原因
  • subprocess.run()默认不启动shell,会将传入列表的第一个元素作为可执行文件尝试运行,你将shell变量赋值语句dirname="a0_"放在首位,系统无法识别该字符串为可执行程序,因此抛出权限错误。
  • 代码存在语法疏漏:'mkdir' '-p'中间缺少逗号,运行时会先触发语法错误。
  • 不需要额外在shell层做变量拼接,Python本身可以直接完成目录名字符串拼接,绕shell逻辑反而增加出错概率。
修复方案

推荐写法(无需调用shell,更安全稳定)

直接在Python层拼接目录名,调用subprocess.run执行mkdir命令:

import os
import subprocess

def SMILEI(I):
    work_path = "/home/velenos14/PICsims/github/SMILEI_correctTunnelBSIrate/Smilei/SIMRESULTS/GPs_trial_Xenon_noOAM"
    os.chdir(work_path)
    a0_val = "%.13f" % a0_from_IntensityWcm2(I)
    dir_name = f"a0_{a0_val}"
    subprocess.run(['mkdir', '-p', dir_name], check=True, text=True)

更优方案(原生Python实现,无需调用系统命令)

直接使用Python内置的os.makedirs完成目录创建,完全不需要依赖subprocess:

import os

def SMILEI(I):
    work_path = "/home/velenos14/PICsims/github/SMILEI_correctTunnelBSIrate/Smilei/SIMRESULTS/GPs_trial_Xenon_noOAM"
    os.chdir(work_path)
    a0_val = "%.13f" % a0_from_IntensityWcm2(I)
    dir_name = f"a0_{a0_val}"
    # exist_ok=True参数等价于mkdir -p的效果,目录已存在时不会抛出异常
    os.makedirs(dir_name, exist_ok=True)

补充:如果你一定要用shell变量的写法(不推荐)

需要手动开启shell参数,且将整个命令作为字符串传入,不要用列表形式:

subprocess.run(f'dirname="a0_{a0_val}"; mkdir -p $dirname', check=True, text=True, shell=True)

开启shell会有注入风险,仅在你完全确认输入参数安全的场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:57:02