如何在Python脚本中更改当前目录?
我正在尝试实现一个自己的'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脚本打印出要切换到的目录,然后让被调用的脚本实际去切换到那个目录。