2013-03-26 67 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之外啓動你的程序。