如何在subprocess.Popen中设置shell变量(以一种不那么丑陋的方式......)

时间:2009-12-04 07:37:40

标签: python unix shell subprocess freebsd

注意:Python: Persistent shell variables in subprocess相同的问题,因为该问题实际上是关于环境变量,而不是shell变量。

我正在尝试使用shell内置time命令自动执行我在csh中执行的基本基准测试。您可以通过在shell中设置相同名称的变量来调整time的输出,如下所示:

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

但是,这当然不是环境变量,因此您无法在env构造函数中的subprocess.Popen参数中传递它(我首先尝试了...)。你可以通过滥用(imo,无论如何)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构造。)

除了这个kludge之外,还有其他方法可以在subprocess中设置shell变量吗?

1 个答案:

答案 0 :(得分:1)

您可以使用有限数量的选项与子进程进行通信(调用参数,环境和流)。由于设置shell变量在更一般意义上修改子进程的内部状态,所以你称之为“kludge”实际上是非常合理的。我不知道任何具有加载shell变量的特殊方法的csh变体。

但是,您可以通过管道将所有初始化命令写入shell,或者甚至将它们写入文件并通过csh的source内置函数读取它。