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

使用subprocess修改路径失败求助(Python3.6+python-telegrambot)

解决subprocess执行cd命令路径不生效的问题

嘿,我太懂这个坑了!你遇到的问题本质是子进程和父进程的环境隔离——subprocess启动的命令是在一个独立的子shell里运行的,这个子shell的工作目录变化完全不会影响你的Python主进程。所以你执行完cd之后,子进程自己切了路径,但你的脚本所在的父进程路径还是原样,下次再跑subprocess命令自然还是老路径。

给你三个实用的解决方案,根据你的需求选就行:

1. 最推荐:用subprocess的cwd参数指定工作目录

不用绕弯子执行cd,直接在调用subprocess时通过cwd参数指定命令要运行的路径。比如你要在/home/user/my_project目录下执行git status:

import subprocess
subprocess.run(["git", "status"], cwd="/home/user/my_project")

如果需要用shell特性(比如通配符、管道),可以加上shell=True:

subprocess.run("ls *.py", cwd="/home/user/my_project", shell=True)

这种方式最干净,也避免了shell注入的风险(只要你不用用户输入拼接命令)。

2. 串联多个shell命令(一次性执行)

如果一定要先cd再执行后续命令,可以把多个命令用&&串联起来,让它们在同一个子shell里运行:

subprocess.run("cd /home/user/my_project && git status && ls", shell=True)

这样cd的效果会作用在后面的git status和ls上,但同样,这只会改变子shell的路径,不会影响Python主进程的工作目录。

3. 改变Python主进程的工作目录

如果你希望后续所有的subprocess命令都默认在新路径下执行,可以直接修改Python进程本身的工作目录,用os.chdir():

import os
import subprocess

os.chdir("/home/user/my_project")
# 之后所有subprocess命令都会默认在这个路径下运行
subprocess.run("git status", shell=True)
subprocess.run("ls", shell=True)

注意:这个操作会影响整个脚本的工作目录,包括文件读写、模块导入等,所以要确认后续操作都依赖这个路径再用。

最后提醒一句:如果你的命令里包含用户输入的内容,尽量不要用shell=True,避免命令注入攻击。把命令拆成列表形式(比如["git", "status"])更安全。

内容的提问来源于stack exchange,提问作者SasaN AndeH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:44:07