2010-05-09 102 views
5

我正在研究一個簡單的Python腳本,它可以使用subprocess和/或os來執行一些命令,它工作正常。運行Python腳本後,終端在給定的目錄下?

但是,當腳本退出時,我想cd實際的終端(在這種情況下是OS X)退出時,新文件已準備好在已創建的目錄中使用。以下所有(subprocess.Popenos.systemos.chdir)可以做我想做的從腳本(即它們在目標目錄中執行的東西),但在退出離開碼頭在腳本自己目錄,而不是目標目錄。

我想避免寫一個shell腳本到臨時文件只是爲了實現這一點,如果這是可能的話呢?

回答

10

可悲的是,沒有。不允許進程更改父進程的環境,在這種情況下,您的Python腳本是shell的子進程。您可以通過讓Python進程設置一個新的shell調用子進程來打開一個shell進程並將其呈現給用戶,從自身繼承修改後的環境來「僞造」它,但是它有強制Python進程運行的缺點不斷。

這實際上是shell腳本的用途。:-)有人顯然需要編寫一個更傳統的shell(例如,比Bash更接近IPython),它可以使用python作爲其腳本語言。

+0

謝謝 - 我將重寫爲shell腳本,並從那裏調用Python :-) – 2010-05-09 21:48:41

+0

您不需要離開Python解釋器。你只需要按照你想要的方式獲得流程環境(例如'os.chdir()')然後'os.execv()'一個新的shell。是的,你仍然會運行一個下級shell,但Python解釋器將被替換。 http://docs.python.org/library/os.html#os.execv – msw 2010-05-09 22:30:11

+0

@msw:我從來沒有能夠可靠地在所有平臺上使用shell(特別是PowerShell),但我應該有建議。 – 2010-05-09 22:47:51

1

您是否嘗試過在當前shell中簡單地運行程序?

$. script.py

,而不是

$script.py

+0

是的,沒有 - 同樣的問題,但謝謝! – 2010-05-09 21:48:00

+1

您不能在當前shell中運行**非shell **腳本。點前綴在這種情況下沒有區別。 – tzot 2010-06-07 13:39:02

4

暫時遺忘Python,沒有子進程可以改變其調用shell的狀態。因此,您需要一個能夠改變Paul Creasey暗示的調用shell的狀態的構造。

alias mycd="cd `echo $1`" 

其中echo可以用script_which_outputs_a_directory_name_on_stdout.py被替換這是一種黑客攻擊的,但至少這是一個古老的黑客。

+0

我明白你的意思了;然而(如果我不重寫是shell腳本),我想我會在最後打印'cd [path_to_dir]',以便它可以複製到命令行! – 2010-05-10 12:29:23