如何以更优雅的方式在subprocess.Popen中设置shell变量
注意:这个问题和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
命令来读取这些命令。