如何以更优雅的方式在subprocess.Popen中设置shell变量

0 投票
1 回答
2446 浏览
提问于 2025-04-15 16:41

注意:这个问题和Python: 在子进程中持久化shell变量的问题不一样,因为那个问题其实是关于环境变量,而不是shell变量。

我正在尝试自动化一个在csh中进行的基本基准测试,使用的是shell内置的time命令。你可以通过在shell中设置同名的变量来调整time的输出,像这样:

set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")

不过,这当然不是环境变量,所以你不能在subprocess.Popen构造函数的env参数中传递它(我最开始就是这么尝试的...)。你可以通过一些技巧,利用cmd参数来实现这个功能,然后你的实际工作(为了更好地显示,简化了一下):

time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)

这样做是可以的,但似乎并不是最好的方法(而且当你想调整很多不同的shell行为时,这样的cmd构造可能会变得相当糟糕)。

有没有其他方法可以在subprocess中设置shell变量,而不是使用这种变通办法?

1 个回答

1

你和一个子进程(也就是你启动的另一个程序)之间的沟通方式是有限的,比如你可以传递一些启动参数、环境变量和数据流。设置一个shell变量,从更广泛的角度来看,就是在改变这个子进程的内部状态。所以你所说的“临时解决办法”其实是很合理的。我不知道有没有csh的变种提供特别的方式来加载shell变量。

不过,你可以通过管道把所有的初始化命令整齐地写入到shell中,或者甚至可以把这些命令写到一个文件里,然后让csh通过它的source命令来读取这些命令。

撰写回答