如何在Python脚本中更改当前目录?

3 投票
5 回答
5017 浏览
提问于 2025-04-15 21:11

我正在尝试实现一个自己的'cd'命令版本,这个命令会给用户展示一个预先设定好的目录列表,用户需要输入一个对应列表中条目的数字。这个程序暂时叫做 my_cd.py,然后它应该能把用户“cd”到选定的目录。下面是这个程序应该如何工作的例子:

/some/directory
$ my_cd.py
1) ~
2) /bin/
3) /usr
Enter menu selection, or q to quit: 2

/bin
$

目前,我尝试使用 os.chdir('dir') 来实现'cd'。但是,这个方法不奏效,可能是因为 my_cd.py 是在自己的子进程中运行的。我试着把对 my_cd.py 的调用放在一个叫 my_cd.sh 的bash脚本中:

#! /bin/bash
function my_cd() {
    /path/to/my_cd.py
}

/some/directory
$ . my_cd.sh
$ my_cd
... shows list of dirs, but doesn't 'cd' in the interactive shell

有没有什么想法可以让我实现这个功能?是否可以通过一个python脚本来改变我当前的交互式命令行的目录?

5 个回答

3

my_cd.py:

#!/usr/bin/env python
import sys

dirs = ['/usr/bin', '/bin', '~']
for n, dir in enumerate(dirs):
    sys.stderr.write('%d) %s\n' % (n+1, dir))
sys.stderr.write('Choice: ')
n = int(raw_input())
print dirs[n-1]

使用方法:

nosklo:/tmp$ alias mcd="cd \$(/path/to/my_cd.py)"
nosklo:/tmp$ mcd
1) /usr/bin
2) /bin
3) ~
Choice: 1
nosklo:/usr/bin$ 
7

把你原来的 bash 代码改成:

#! /bin/bash
function my_cd() {
    cd `/path/to/my_cd.py`
}

然后把你的 Python 代码改成这样:所有的 cosmetic 输出(比如给用户的消息、菜单等等)都放到 sys.stderr 上。最后,不要用 os.chdir,而是直接用 print 把要切换到的目录路径输出到 sys.stdout

2

这件事是做不到的。工作目录的改变对父进程是不可见的。最好的办法是让Python脚本打印出要切换到的目录,然后让被调用的脚本实际去切换到那个目录。

撰写回答