2016-05-13 115 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的聪明逻辑。