如何在python中更改目录,以便在运行脚本后仍保留该目录?

che*_*kid 5 python

我正在尝试通过python脚本更改终端目录。我已经看过这篇文章以及其他类似的文章,所以我对os.chdir有所了解,但是它并没有按照我想要的方式工作。os.chdir似乎更改了目录,但仅适用于python脚本。例如我有这段代码。

#! /usr/bin/env python
import os

os.chdir("/home/chekid/work2/")
print os.getcwd()
Run Code Online (Sandbox Code Playgroud)

不幸的是,运行后,我仍然位于python脚本的目录中(例如/ home / chekid),而不是我想进入的目录。请参见下文。

gandalf(pts/42):~> pwd
/home/chekid

gandalf(pts/42):~> ./changedirectory.py
/home/chekid/work2

gandalf(pts/42):~> pwd
/home/chekid
Run Code Online (Sandbox Code Playgroud)

对我应该怎么做有什么想法?

编辑:看起来我想做的事并不存在于'正常'python中。我确实找到了解决方法,尽管对我来说看起来并不那么优雅。

 cd `./changedirectory.py`
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 6

你不能。shell 的当前目录属于 shell,而不是你。

(好吧,你可以ptrace(2)调用 shell 并让它调用chdir(2),但这可能不是一个很好的设计,在 Windows 上不起作用,而且我不会开始知道如何在纯 Python 中做到这一点,除非你可能不得不搞砸使用 ctypes 或类似的东西。)

您可以使用当前工作目录启动子shell。这可能足够接近您的需要:

os.chdir('/path/to/somewhere')
shell = os.environ.get('SHELL', '/bin/sh')
os.execl(shell, shell)
# execl() does not return; it replaces the Python process with a new shell process
Run Code Online (Sandbox Code Playgroud)

原始外壳仍然存在,因此请确保不要将其留在周围。如果您最初使用exec内置函数(例如exec python /path/to/script.py)调用 Python ,那么原始 shell 将被 Python 进程替换,您不必担心这一点。但是如果 Python 在没有启动 shell 的情况下退出,你将根本没有打开 shell。


che*_*ner 3

当前工作目录是进程的一个属性。它不能被其他程序更改,例如通过运行单独的 Python 程序来更改 shell 中的当前工作目录。这就是为什么cd总是shell 内置命令的原因。