2010-07-15 104 views
3

我遇到了將我公司的一個腳本從csh轉換爲Python的問題。 csh腳本調用別名命令,但是當我通過os.system()調用相同的別名命令時,它不起作用。在Python 2.3中克服os.system()限制

所以,如果foo是別名命令:

CSH腳本(這工作,執行FOO):

foo <argument> 

的Python(這不起作用,錯誤聲稱foo是一個未知的命令):

os.system("foo <argument>") 

我想,一定有某種上下文切換,當我執行python腳本,這會導致Python來無法獲得在T創建別名發生他的殼。在閱讀文檔後,似乎os.system已被棄用,轉而使用subprocess,並且subprocess有一個shell參數,可能可以幫助我解決問題,因爲我使用Python 2.3和subprocess isn'直到版本2.4纔可用。

我有想法在python中複製別名。因此,例如,foo被別名爲cp

CSH:

alias foo cp 
foo file1 file2 

的Python:

os.system("alias foo cp") 
os.system("foo file1 file2") 

沒有骰子......這裏的錯誤,以及:

sh: line 0: alias: foo: not found 
sh: line 0: alias: cp: not found 
sh: foo: command not found 

我最後的努力是採取的幾行代碼使用foo,並將它們放入Python將調用的自己的CSH腳本中。但是如果有一種方法可以做到這一點而不訴諸於此,我很想知道這件事。

在此先感謝!

回答

8

是什麼讓你覺得os.system會使用csh?它使用標準的C函數系統,在Unix系統上只會調用basic/bin/sh。這不會是csh,但很可能是bash,或者它的一些簡單版本。

順便說一下:請注意,在os.system中使用shell環境所做的操作不會影響隨後對os.system的調用,因爲每個調用都在不同的子shell中運行。換句話說,對環境所做的改變就失去了。而你對別名的調用失敗,因爲/ bin/sh使用與csh不同的別名語法。

您可以通過沿線運行不foo的事,但解決此:

os.system("/bin/csh -i -c 'foo arg1 arg2'") 

注意這是爲了迫使CSH讀取啓動腳本選項-i

+0

「是什麼讓你覺得os.system會使用csh?」 無知? :)我以爲它只是傳遞一個字符串到命令行。 感謝您的回答。這解決了我遇到的問題,但不幸的是,由於每次調用都在其自己的子shell中運行,因此我將不得不完全找出不同的解決方案。 我的'foo'命令的性質是這樣的,它加載了一堆其他東西供你的腳本使用,所以如果這些東西一旦os.system命令完成就會丟失,那麼它將無法工作。 – 2010-07-15 18:13:36

+1

它確實將這些東西傳遞給命令行。只是沒有單一類型的命令行;)如果它爲後續命令加載其他東西,並且將整個東西轉換爲python,也許應該先將其他東西轉換爲python;) – 2010-07-15 19:35:53

0

如果你願意在Python中的「foo」的別名,然後執行調用使用os.system前走樣自己:

cmd = "foo file1 file2" 
foo_alias = "cp" 

cmd = re.sub("^foo ", foo_alias + " ", cmd) 
os.system(cmd) 

如果foo的別名是更復雜(有參數替換等) ,這可能會更困難。