2009-02-10 100 views
4

如果不使用新的2.6子進程模塊,我怎樣才能使用tcsh而不是bash來獲得os.popen或os.system來執行我的命令?我需要在執行一些其他命令前編寫一些在tcsh中編寫的腳本,我需要在python2.4中執行此操作。在python 2.4中,如何使用csh而不是bash來執行外部命令?

編輯 感謝您使用'tcsh -c'的答案,但我想避免這種情況,因爲我必須避免瘋狂。該字符串將被bash解釋,然後由tcsh解釋。我必須這樣做:

os.system("tcsh -c '"+re.compile("'").sub(r"""'"'"'""",my_cmd)+"'") 

不能我只是告訴Python開闢一個「tcsh的」子,而不是一個「慶典」子?那可能嗎?

P.S. 我意識到bash是貓的喵喵,但我正在企業環境中工作,我要選擇而不是打一場tcsh vs bash的戰鬥 - 更大的魚來炒。

+0

你是什麼意思的「來源」? – hop 2009-02-10 20:23:26

+0

如果你執行一個像'source env_mod.csh'這樣的命令,那麼腳本會修改你當前的shell。如果您執行'tcsh -f env_mod.csh',則shell腳本將創建一個子shell,該子shell繼承當前shell的環境變量並在不修改父shell的情況下執行。 – 2009-02-10 21:51:41

+0

示例包含您的〜/ .bashrc文件,該文件在啓動新的bash shell時會獲取「sourced」。 – 2009-02-10 21:53:34

回答

-1

os.system()電話system(3)直接,而這個系統調用是一個「選「 貝殼。我把它放在引號中,因爲system(3)將始終執行/bin/sh

因此,如果你想Python中使用不同的外殼,你有幾種選擇:

  • 更改符號鏈接/bin/sh指向tcsh。這將對整個系統產生影響,這不應該成爲問題,因爲需要bash功能的腳本無論如何都應該以/bin/bash開頭。

  • chroot環境中運行您的Python腳本,其中/bin/sh指向tcsh

  • 替換/bin/sh與執行取決於誰調用它bashtcsh腳本(你可以,例如,通過附加的環境變量。)

  • 把你想要的一切在tcsh在單獨執行shell腳本和os.system('tcsh -c...')調用。這樣你就不必逃避任何事情。

5

如何:

>>> os.system("tcsh your_own_script") 

或者只是寫劇本,並在文件的開頭添加

#!/bin/tcsh 

,讓操作系統採取照顧。

11

只需將shell作爲命令的一部分加上前綴即可。我沒有tcsh的安裝但zsh中:

>>> os.system ("zsh -c 'echo $0'") 
zsh 
0 
-1

剛剛成立的外殼使用是tcsh

>>> os.environ['SHELL'] = 'tcsh' 
>>> os.environ['SHELL'] 
'tcsh' 
>>> os.system("echo $SHELL") 
tcsh