Python中Linux $PATH变量出现`No such file or directory`错误如何解决?

刚刚在 /etc/profile 中添加了 PATH 信息,然后顺手检查一下效果,发现一个奇怪的信息: $ $PATH -bash: /usr/local/java-se-7u75-ri/java-se-7u75-ri/bin:/usr/local/mongodb/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games: No such file or directory

然后直接输出 $ echo $PATH /usr/local/java-se-7u75-ri/java-se-7u75-ri/bin:/usr/local/mongodb/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

看起来目录都是有的,为什么会有这样的提醒:No such file or directory 表示很疑惑????


Python中Linux $PATH变量出现`No such file or directory`错误如何解决?

4 回复

你在 Shell 中输 $PATH,它替换成 PATH 变量的内容了,然后再去尝试解释运行它,就是No such file or directory咯。怎么可能有符合这一大串的路径或命令存在系统中?而且中间有冒号分隔的


这个错误通常是因为系统在$PATH环境变量指定的目录里找不到你要执行的命令。在Python里,最常见的情况是你用subprocess调用了系统命令,但命令所在的目录不在$PATH里,或者命令本身就没安装。

核心原因就两个:

  1. 你调用的命令(比如 ls, grep, ffmpeg, 或者某个自定义脚本)没安装。
  2. 命令安装了,但它的安装路径没被加到$PATH里。

排查和解决方法:

1. 先确认命令是否存在和路径 在你的Python脚本里,可以先用shutil.which()检查命令在$PATH里是否能被找到。

import shutil
import subprocess

cmd = 'your_command'  # 换成你实际要执行的命令,比如 'ls', 'ffmpeg'
cmd_path = shutil.which(cmd)

if cmd_path:
    print(f"命令 '{cmd}' 位于: {cmd_path}")
    # 然后使用绝对路径执行
    result = subprocess.run([cmd_path, 'arg1', 'arg2'], capture_output=True, text=True)
else:
    print(f"错误: 在 $PATH 中找不到命令 '{cmd}'")

2. 如果命令存在但路径不对

  • 临时添加路径(推荐用于脚本内): 在执行subprocess前,修改os.environ['PATH']
    import os
    import subprocess
    
    # 假设你的命令在 /usr/local/bin 或 /home/user/my_tools
    custom_path = '/usr/local/bin:/home/user/my_tools'
    os.environ['PATH'] = custom_path + ':' + os.environ.get('PATH', '')
    
    # 现在再执行命令
    subprocess.run(['your_command', 'arg1'])
    
  • 永久修改PATH: 这属于系统配置,不是Python代码能完全解决的。你需要去修改shell的配置文件(如 ~/.bashrc, ~/.zshrc),添加 export PATH="/your/custom/path:$PATH",然后重启终端或执行 source ~/.bashrc

3. 如果命令确实没安装 那就去安装它。比如在Ubuntu上用 apt-get install package-name,在macOS上用 brew install package-name

一句话总结: 要么用shutil.which找到命令全路径再执行,要么把命令所在目录加到os.environ['PATH']里。

你的环境变量加错了。
系统默认定义了一个 PATH,同时定义了 PATH 的内容。
然后你又定义了一个 PATH,同时定义了 PATH 的内容。
基于后覆盖先的顺序加载,你的 PATH 会把系统的 PATH 变量给顶掉,所以会报错。而且你仔细看看报错的内容,是 bash 报的错,说明在你定义的目录中不存在"bash"的可执行文件。

正确的写法是:
export PATH=$yourPathArgument:$PATH
在 PATH 中用冒号隔开后接“$PATH ”,表示加载“之前被定义过的 PATH 变量”。

这是一个范例:
export JAVA_HOME=/usr/local/jdk/latest
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

,是我懵逼了

回到顶部