在 Python 中更改呼叫者的当前工作目录

Change caller's current working directory in Python

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

实现的细节并不重要,但理想情况下,我会将此脚本放在 /usr/bin 中,并使用一个参数调用它,该参数表示我想在系统上转到的位置:goto project1

我希望当脚本退出时,我终端的当前工作状态会更改为项目 1 的工作状态。

为了完成这个,我试过:

os.chdir('/')

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

这两个都不起作用。第一个更改 Python 中的工作目录,第二个在 /.

生成一个 shell

然后我意识到我是多么的天真。当一个程序是 运行 时,终端只是分叉一个进程,同时从我的程序正在写入的 stdout 读取。不管它做什么,它都不会影响终端的状态。

但后来我想到 "I've been using cd for years, surely someone wrote code for that",认为可能会有一些问题(系统调用或其他?)。

但是 cd 甚至还不是 coreutils。相反,cd 的来源是这样的:

builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${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 `

结果:

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

根据需要替换您最喜欢的 shell 和 Python 的变体。为 Python 脚本打开执行以进一步简化。

很明显,shell 正在更改目录,但 Python 可以执行所有你想弄清楚将 shell 发送到何处的巧妙逻辑。