2013-03-26 61 views
0

我有一个Python程序需要执行一个不同的进程(我使用subprocess.Popen)。我需要这个执行的行为,就好像下面是通过在shell命令提示符用户输入:健壮地识别哪个shell运行

$ source path/to/some_file 
$ ./some_program 

我希望我会用shell=True和某种形式的命令链来第一次运行source,然后执行程序。不过,我面临着以下问题:

这将启动我的Python程序的外壳可能是bashshtcsh(或可能的csh一番风味)。我需要根据哪个shell运行不同的some_file。有没有办法确定这一点?无论是在Python中还是通过运行Popen(..., shell=True)内的东西,都可以。

我正在考虑写一些“壳多语种”的获得来自不同炮弹输出不同,但我的壳技能(尤其在csh)都达不到这样的任务。我有什么选择?

+0

可以通过使用[可执行](http://docs.python.org/2/library/subprocess.html#subprocess.Popen)参数与'壳= TRUE'强迫一个特定的壳。 – 2013-03-26 13:17:21

+1

在Unix上,无论用户实际使用哪个shell,所使用的shell默认为/ bin/sh。 – Cairnarvon 2013-03-26 13:18:36

+0

@Cairnarvon,是的,但/ bin/sh符合不同的Linux上的不同的东西。 – 2013-03-26 13:19:07

回答

1

..有关产卵壳然后与它沟通?

我的意思是,像这样:

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

既然要执行一个特定壳内的两个命令,我认为这将是你最好的解决方案。否则,您可能会发现您的shell接受诸如“初始化脚本”和“初始命令”之类的参数;在这种情况下,如果你只需要使用特定的shell,你应该使用它们;例如,bash接受--init-file file-c command这样做的工作(将加载--init-file而不是bashrc)。

3

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

但实际上,任何给定的shell脚本都可以为一种特定类型的shell编写。假设它是bash

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

你去那里:然后你就可以简单地通过编写shell脚本这样忽略Python端这些细节完全启动脚本转换在开始来砸,源所需的位,然后启动程序。任何合理的shell都应该能够运行它,所以现在你不需要担心Python究竟调用哪个shell ......再加上你有一种更加可重复的方式来在Python之外启动你的程序。