2012-04-27 51 views
4

据为subprocess模块的文档,它的默认外壳是/bin/sh,但我有一种根深蒂固的,也可能是非理性的,厌恶硬编码这样的常量。如何获得“经典UNIX外壳”的Python

因此,我更喜欢引用subprocess中定义的一些常数。我一直无法找到任何方式询问subprocess直接为这个常数。我已经成功的最好的是

def _getshpath(): 
    return subprocess.check_output('which sh', shell=True).strip() 

def _getshpath(): 
    return subprocess.check_output('echo "$0"', shell=True).strip() 

...这两者看起来可怜脆弱,因为它们的有效性最终取决于正是我试图确定在特定的值第一名。 (即,如果该可执行文件的值不是“/ bin/sh的”,无论是清晰度很容易被荒谬的。)

什么是最佳实践获得此路径(没有硬编码为“/ bin/sh的“)?

谢谢!

+0

'subprocess'本身将路径硬编码为'/ bin/sh'。也许你应该这样做,或者只是使用你描述的方法之一:) – 2012-04-27 22:51:50

+0

该路径硬编码(/ bin/sh)在哪里?它是否是子进程的成员? – ncRubert 2012-04-27 23:14:30

+0

/bin/sh应该是标准的POSIX shell,所以你不能在POSIX环境中出错。在任何其他环境中......谁知道? – 2012-04-27 23:15:52

回答

3

将它硬编码为/ bin/sh是完全有效的。如果你看看C的popen()的文档,你会发现它也是这样。/bin/sh是通过构建系统的标准外壳。

1

你可以尝试

>>> import os 
>>> shell = os.environ['SHELL'] 
>>> print shell 
'/bin/bash' 

您可以使用此设置的subprocess.Popenexecutable说法。