Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python脚本更改目录:如何不打开新shell_Python_Bash_Shell_Os.path - Fatal编程技术网

从python脚本更改目录:如何不打开新shell

从python脚本更改目录:如何不打开新shell,python,bash,shell,os.path,Python,Bash,Shell,Os.path,我有以下代码: import os unixshell=os.environ["SHELL"] dir="/home/user/somewhere" if os.path.isdir(dir): os.chdir(dir) os.system(unixshell) 这是我写给书签文件夹的脚本的一部分,我经常在终端中访问这些文件夹。脚本的一部分进入(cd)书签目录。我使用它的方式如下 ~/olddir$ bk.py go [handle to bookmarked direct

我有以下代码:

import os

unixshell=os.environ["SHELL"]
dir="/home/user/somewhere"
if os.path.isdir(dir):
    os.chdir(dir)
    os.system(unixshell)
这是我写给书签文件夹的脚本的一部分,我经常在终端中访问这些文件夹。脚本的一部分进入(cd)书签目录。我使用它的方式如下

~/olddir$ bk.py go [handle to bookmarked directory]
~/bookmarkeddir$
但是,我不喜欢的是创建了一个新的bashshell,所以当我需要注销时,我必须按
CTRL+D
多次

问题是,我可以在不创建新shell的情况下更改目录吗?使用Python2.4中存在的模块是否可以实现这一点,或者我是否需要使用更高版本

编辑:我的问题与此问题更为重复:


问题是
python
在子进程中运行,并且它“不能”更改父进程的当前目录(我说“不能”,但可能有一些调试器可以做到这一点-不要去那里!)

最简单的解决方案是使用函数。例如:

bk() {
    dir="/home/user/somewhere"

    # equivalent to "if os.path.isdir(dir): os.chdir(dir)"
    [[ -d $dir ]] && cd "$dir"
}
将其放入名为
bk.sh
的文件中(例如)

要编译和加载函数,请执行以下操作:

. bk.sh
然后,只要您想更改目录,就使用
bk


函数的不同之处在于它在当前进程中运行,而不是创建新的shell。

为什么需要
os.system(unixshell)
命令
os.chdir(dir)
本身就可以了。您需要创建一个bash函数并更改函数中的目录。该函数可以使用外部工具(如python脚本)来确定要更改到哪个目录。@l'l'l我从终端运行命令,运行python脚本后,该目录应该是我标记的目录。目标是改进我在终端中的导航。问题是这个脚本打开了一个新的bash shell。我想要相同的功能,但不需要通过此脚本从旧的shell打开新的bash shell。哦,我明白了,您可能需要接受n.m.的建议并执行类似的操作:,或者。我可能会这样做,但只是带着悲伤,因为我的python脚本看起来很不错。@Magicsowon:一般来说,在bash中执行bash操作会更好,而在pythonI中执行python操作最终会在我的python脚本中使用此解决方案。我的脚本在第一次调用该函数时将其写入.bashrc。我还在函数中添加了这个:
dir=`bk.pyshow$1`
。这样,该函数将处理我列表中的目录和该目录的cd。