在Python中更改调用者的当前工作目录

时间:2016-05-13 05:25:44

标签: python shell cd

我正在写一个简单的脚本,理想情况下可以帮助我方便地更改系统周围的目录。

实施的细节并不重要,但我们理所当然地说,我将把这个脚本放在/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+"$@"}

因此,我想到了几个问题:

  • 当用户拨打cd时,幕后实际发生了什么? (意思是终端和系统如何实际交互?)
  • 是否有可能像Python脚本那样改变终端位置?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分: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发送位置的聪明逻辑。