【发布时间】:2021-12-13 15:23:27
【问题描述】:
subprocess.run() 有问题。
我尝试在 W10 内的 WindowsSubsystemForlinux1 WSL1 应用程序中创建一个新目录。
目录名称应为(例如):a0_998.0784269595375(逗号后始终为 13 位)。
这组数字是 Python 函数的输出。
我有什么:
def SMILEI(I):
os.chdir("/home/velenos14/PICsims/github/SMILEI_correctTunnelBSIrate/Smilei/SIMRESULTS/GPs_trial_Xenon_noOAM")
a0 = "%.13f" % a0_from_IntensityWcm2(I) # a0_from_IntensityWcm2() is a function
subprocess.run(['dirname="a0_"', 'mkdir' '-p' '$dirname'], check=True, text=True) # PermissionError: [Errno 13] Permission denied: 'dirname="a0_'
我做错了什么? BASH 命令(工作并完成工作)如下:
for ((i = 1; i <= 15000; i++))
do
index=$((i))
a0=$(awk "NR==${index} { print \$2 }" Intensity_Wcm2_versus_a0_10_20_10_25_range.txt)
dirname="a0_${a0}"
mkdir -p $dirname
cd $dirname
done
【问题讨论】:
-
为什么要将 mkdir 作为子进程运行,而不是使用(效率更高)告诉操作系统立即创建目录的内置 Python 函数?
-
@velenos14 :您正在尝试执行名为
dirname="a0_"的外部程序。数组中的第一个参数是要运行的程序。 -
无论如何 --
dirname="a0_${a0}" mkdir -p $dirname作为一个简单的命令在 bash 中甚至没有你想要的效果(参数扩展是从 shell 变量完成的;环境变量只为带有前导 key= 的单个命令设置value 语法没有及时设置参与),更重要的是,用实际的目录名称替换$dirname是一个 shell 功能,所以当你直接执行没有 shell 的子进程时,它永远没有机会发生首先。 -
如果您确实想在子进程运行时设置环境变量,顺便说一下,所有子进程函数都有一个单独的参数,可以让您传入它们的字典。
-
两行部分很关键。在 shell 中尝试
a="one"; a=two echo "$a"-- 你会看到它与one相呼应,而不是two
标签: python bash scripting subprocess