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

