从Python脚本中更改目录:如何不打开一个新的shell
从Python脚本中更改目录:如何不打开一个新的shell
我有以下的代码片段:\n
import os unixshell=os.environ["SHELL"] dir="/home/user/somewhere" if os.path.isdir(dir): os.chdir(dir) os.system(unixshell)
\n这是我写的一个脚本的一部分,用于标记我经常在终端中访问的文件夹。脚本的一部分会(cd)到标记的目录。我使用以下方式:\n
~/olddir$ bk.py go [handle to bookmarked directory] ~/bookmarkeddir$
\n但是,我不喜欢的是会创建一个新的bash shell,所以当我需要注销时,我必须多次按下CTRL+D
。\n问题是,我能否在不创建新的shell的情况下改变目录?在Python 2.4中是否有可能使用现有的模块,还是我需要升级到更高版本?\n编辑:我的问题更类似于这个问题:\n
\nChange directory of a parent process from a child process\n
问题的原因是,Python脚本在子进程中运行,无法修改父进程的当前目录。最简单的解决方法是使用一个函数来实现。将以下代码放入一个名为bk.sh的文件中:
bk() { dir="/home/user/somewhere" # equivalent to "if os.path.isdir(dir): os.chdir(dir)" [[ -d $dir ]] && cd "$dir" }
然后执行以下命令来编译和加载该函数:
. bk.sh
接下来,只需在需要更改目录的时候使用bk命令即可。函数与脚本的不同之处在于,它在当前进程中运行,而不创建新的shell。
最终,我使用了这个方法来解决我的Python脚本的问题。我的脚本在第一次调用时将这个函数写入了.bashrc文件。我还在函数中添加了以下代码:dir=`bk.py show $1`
。这样,函数会获取列表中的目录句柄,并将当前目录更改为该目录。