2016-05-13 107 views
1

我正在編寫一個簡單的腳本,它可以幫助我方便地更改系統周圍的目錄。在Python中更改調用者的當前工作目錄

的實現細節並不重要,但是我們要說最好我將會把這個腳本在/usr/bin與參數表示調用它,我想去系統:goto project1

我期望該腳本退出時,我的終端的當前工作會改變該項目1.

。爲了做到這一點,我想:

os.chdir('/') 

subprocess.call('cd /', shell=True) 

無論其工作。第一個在Python中更改工作目錄,第二個在/生成一個shell。

然後我意識到我是如何天真的。當一個程序運行時,終端只是在從程序寫入的stdout讀取過程中分叉進程。不管它做什麼,它都不會影響終端的狀態。

但後來我想「我已經使用cd多年了,當然有人爲此寫了代碼」,認爲可能會有某些事情要做(系統調用或其他?)。

但是cd甚至不是coreutils。反而,cd來源是這樣的:

builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"[email protected]"} 

所以,一對夫婦的問題浮現在腦海中:

  • 什麼實際發生在當用戶調用cd幕後? (意思是,終端和系統如何實際交互?)
  • 是否有可能像Python腳本那樣改變終端位置?

非常感謝您的幫助!

+0

「更改調用者的當前工作目錄」 - 據我所知,這根本不可能。即使他們要求你也不能使用另一個進程的工作目錄。 – user2357112

+0

我想這可能是答案。 爲什麼'bash'允許這個呢?如果我運行用'bash'編寫的腳本來做到這一點,我會(顯然)能夠改變它。 –

+0

不!嘗試一下。 'echo'cd /'> cd.sh; 。/ cd.sh',你會發現你的工作目錄沒有改變。 – user2357112

回答

1

你可以做一對腳本:

directory.py

#!/usr/bin/python 

import sys 

directory = sys.argv[1] 

# do something interesting to manipulate directory... 

print directory + "tmp" 

directory.csh

#!/bin/csh -f 

cd `python directory.py $1` 

結果:

> pwd 
/Users/cdl 
> source directory.csh "/" 
> pwd 
/tmp 
> 

根據需要替換您喜歡的shell和Python變體。打開Python腳本的執行以進一步簡化。

顯然shell正在改變目錄,但Python可以完成所有你想要發送shell的聰明邏輯。

相關問題