5

我巧合地发现我无法从 python 代码中更改实际目录。我的测试程序如下:

from os import system

def sh(script):
    system("bash -c '%s'" % script)

sh("cd /home")
sh("pwd")

的输出pwd不是/home,而是上面代码所在的目录。

有人可以解释为什么会这样吗?

4

5 回答 5

6

问题是您执行 shell 命令而不是使用实际更改目录os.chdir()

每个os.system()调用都会在一个新的 shell 中执行给定的命令——因此脚本的工作目录根本不受影响。

于 2012-12-05T20:55:43.047 回答
5

该目录实际上已更改,但在另一个进程中,您的脚本的子级。有一个简单的规则要记住:孩子永远不能影响其父母的环境(PATH、CWD 等)。

于 2012-12-05T20:55:09.453 回答
3
sh("cd /home")
sh("pwd")

^ 这会产生 2 个单独的外壳,请尝试:

sh("cd /home; pwd")
于 2012-12-05T20:55:51.857 回答
2

当您运行 sh 函数时,您会生成一个新的 bash 进程,然后该进程会更改当前目录并退出。然后你生成一个新进程,它对第一个 bash 进程发生了什么一无所知。它的当前目录再次设置为当前用户的主目录。
要更改 Python 进程的当前工作目录,请使用

os.chdir("blah")`
于 2012-12-05T20:56:54.737 回答
1

每个sh( )调用都会生成一个不同的 shell,因此您影响的是 shell 的工作目录,而不是 python 的。要更改 pythons 工作目录,请使用chdir()

于 2012-12-05T20:56:50.190 回答