如何在Python3脚本中通过Bash命令切换目录?
这是个非常常见的误区,我来给你理清楚问题出在哪,以及怎么解决:
当你用subprocess.Popen()、subprocess.call()或者subprocess.run()执行cd命令时,本质上是启动了一个独立的子Shell进程。这个子进程确实会切换自己的工作目录,但它和你的Python主进程是完全隔离的——就像你开了两个终端窗口,在A窗口里cd到某个路径,B窗口的当前路径根本不会变。子进程执行完cd就退出了,对你的Python脚本所在的进程没有任何影响。
另外还要提一句:cd是Shell的内置命令,不是系统里的独立可执行文件,你直接传['cd', '/foo/bar/xxx']给subprocess的话,它其实找不到这个命令(除非你加上shell=True参数),但就算加了shell=True,也只是让子Shell执行cd,依然改变不了父进程的路径。
根据你的实际需求,分两种场景来解决:
场景1:只是想让后续的子进程命令在目标路径下执行
如果你不需要改变Python脚本本身的工作目录,只是希望通过subprocess启动的其他命令(比如ls、git)在/foo/bar/xxx下运行,直接用subprocess的cwd参数就好,根本不需要调用cd:
import subprocess # 示例:在目标目录下执行ls命令 subprocess.run(['ls'], cwd='/foo/bar/xxx')
这样启动的子进程会直接进入指定路径执行命令,简单高效。
场景2:需要让Python脚本本身切换工作目录
如果你的需求是让整个Python脚本后续的代码都在/foo/bar/xxx路径下运行(比如读取该目录下的文件),那别用subprocess了,直接用Python标准库的os.chdir():
import os os.chdir('/foo/bar/xxx') # 验证一下当前路径 print(os.getcwd()) # 会输出 /foo/bar/xxx
这样整个Python进程的工作目录就切换过去了,后续所有依赖路径的操作都会基于这个新路径。
内容的提问来源于stack exchange,提问作者th3g3ntl3man

