稳健地识别正在运行的shell

时间:2013-03-26 13:15:06

标签: python shell popen

我有一个需要执行不同进程的Python程序(我使用subprocess.Popen)。我需要执行此操作,就像用户在shell命令提示符下键入以下内容一样:

$ source path/to/some_file
$ ./some_program

我希望我会使用shell=True和某种形式的命令链来首先运行source,然后执行该程序。但是,我面临以下问题:

启动我的Python程序的shell可能是bashshtcsh(或者其他一些csh的风格)。我需要根据运行的shell来获取不同的some_file。有没有办法确定这个?无论是在Python中还是在Popen(..., shell=True)内部运行,都可以。

我正在考虑编写某种“shell polyglot”来获取不同shell的不同输出,但我的shell技能(特别是在csh中)不能胜任这样的任务。我有什么选择?

2 个答案:

答案 0 :(得分:3)

subprocess.Popen()使用的shell不是由用于启动Python的父shell决定的。相反,默认情况下,Python使用的shell始终为/bin/sh,如果需要,可以通过在Popen()中明确指定可执行文件来更改它。

但实际上,任何给定的shell脚本都可以为一种特定类型的shell编写。我们说它是bash。然后你可以通过写一个像这样的shell脚本来忽略Python方面的这些细节:

#!/usr/bin/env bash
source path/to/some_file
exec ./some_program

你去了:一个完整​​的启动器脚本,它在开始时切换到bash,提供必要的位,并启动你的程序。任何合理的shell都应该能够运行它,所以现在你不必担心Python调用哪个shell ...而且你有一种更可重复的方式在Python之外启动你的程序。

答案 1 :(得分:1)

..如何生成shell然后与它进行通信?

我的意思是,像这样:

proc = subprocess.Popen(['/bin/bash'], stdin=PIPE, stdout=PIPE)
proc.communicate("source path/to/some_file\n"
                 "./some_program\n")

由于您想在特定shell中执行两个命令,我认为这将是您拥有的最佳解决方案。

否则,您可能会发现shell接受诸如“init script”和“initial command”之类的参数;在这种情况下,如果你只需要使用那个特定的shell,你应该使用它们;例如,bash会接受--init-file file-c command来完成这项工作(--init-file将会加载而不是bashrc。)