Ubuntu22.04下Python调用subprocess无报错但无法打开VSCode怎么办
问题场景
Ubuntu 22.04环境下使用Python开发C++项目管理器,尝试通过如下Python代码唤起VSCode打开指定项目目录:
subprocess.run(["cd", project_dir], shell=True) subprocess.run([utility.get_ide_cmd()], shell=True)
已知信息:
- 代码运行无报错,但VSCode始终无法正常打开目标项目
utility.get_ide_cmd()返回值为code .project_dir为待打开的目标项目存储路径- Python脚本通过bash执行
python3 <脚本名> <启动参数>方式启动
根因分析
- 每一次
subprocess.run调用都会启动独立的子shell进程,第一次调用执行的cd命令仅在当前子进程生命周期内生效,进程退出后工作目录的变更不会同步到第二个subprocess.run的执行环境,第二个命令执行时的工作目录仍是Python脚本的启动目录,而非目标项目路径。 subprocess.run使用shell=True参数时,第一个位置参数需要传入字符串格式的完整命令;传入列表时仅列表首个元素会被识别为待执行命令,其余元素会被当作shell本身的启动参数,不会传递给目标执行命令,进一步导致命令执行逻辑不符合预期。
修复方法
不需要单独执行cd命令切换目录,直接在调用VSCode命令时通过cwd参数指定子进程工作目录即可,调整后代码:
import subprocess subprocess.run(utility.get_ide_cmd(), shell=True, cwd=project_dir)
如果要规避shell=True带来的命令注入风险,可使用更安全的列表传参方式,直接将目标路径作为code命令的参数传入,无需依赖工作目录切换:
import subprocess subprocess.run(["code", project_dir])
补充说明:如果执行时提示找不到
code命令,打开VSCode后按Ctrl+Shift+P调出命令面板,搜索并执行Shell Command: Install 'code' command in PATH,将VSCode命令行入口添加到系统PATH后重启终端即可正常调用。
内容的提问来源于stack exchange,提问作者Rylan Yancey
相关产品推荐
相关产品推荐

