【问题标题】:How do I change directory in python so it remains after running the script?如何在 python 中更改目录,以便在运行脚本后保留?
【发布时间】:2015-12-04 18:17:57
【问题描述】:

我正在尝试通过 python 脚本更改终端目录。我看过这个post 和其他喜欢它的人,所以我知道 os.chdir,但它并没有按照我想要的方式工作。 os.chdir 似乎更改了目录,但仅适用于 python 脚本。例如我有这个代码。

#! /usr/bin/env python
import os

os.chdir("/home/chekid/work2/")
print os.getcwd()

不幸的是,运行后我仍然在 python 脚本的目录中(例如 /home/chekid),而不是我想要的目录。见下文。

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

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

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

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

编辑:看起来我正在尝试做的事情在“普通”python 中不存在。我确实找到了解决方法,尽管它对我来说看起来并不那么优雅。

 cd `./changedirectory.py`

【问题讨论】:

  • python 脚本改变了它自己的目录。巴什没有改变。请注意,您的要求与假设如果您在 python 脚本中打开一个文件,该文件也应该在您的桌面上打开是一样的
  • 你做不到。这就是为什么cd 始终是一个 shell 内置命令,而不是一个外部程序。
  • 也许你想使用os.system()
  • @SantoshKumar:行不通,system 有点“运行自己的外壳”。

标签: python


【解决方案1】:

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

(好的,你可以 ptrace(2) 外壳并让它调用 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

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

【讨论】:

  • 这听起来像是一个有趣的项目 :-)。我想如果你能找到你可以做的代码区域,基本上就是代码注入攻击。呵呵。
  • @Linuxios:我不确定我是否会准确地称之为“攻击”。您基本上只是在手动完成 gdb 技巧。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果你作弊,你可以:制作一个调用你的 python 脚本的 bash 脚本。 python 脚本返回您要将目录更改为的路径。然后 bash 脚本执行实际的 chdir。当然,您必须使用“source”在 bash shell 中运行 bash 脚本。

    【讨论】:

      【解决方案4】:

      您可以让您的 python 打印您想要移动到的目录,然后使用 cd "$(./python-script.py)" 调用您的脚本。在条件下,您的脚本实际上不会打印任何其他内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多