You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python3脚本中通过Bash命令切换目录?

这是个非常常见的误区,我来给你理清楚问题出在哪,以及怎么解决:

为什么你的subprocess调用cd完全没效果?

当你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:35:09