python执行subprocess.Popen() 报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件

问题:
Windows系统下,python使用self.pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE) ,FileNotFoundError: [WinError 2] 系统找不到指定的文件

主要代码模块如下:

command = ['ffmpeg', 
                   '-y', '-an', 
                   '-f', 'rawvideo',  
                   '-vcodec', 'rawvideo', 
                   '-pix_fmt', 'bgr24', 
                   '-s', "{}x{}".format(self.width, self.height), 
                   '-r', str(self.fps),  
                   '-i', '-', 
                   '-c:v', 'libx264', 
                   '-pix_fmt', 'yuv420p',
                   '-preset', 'ultrafast',
                   '-f', 'rtsp',
                   '-rtsp_transport', 'tcp',
                   push_url]  # rtsp rtmp
self.pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE) 

报错如下:

img

ffmpeg是否添加到环境变量?这个提示就是没找到命令

'-f', 'rawvideo' 这个参数指的是文件吧,
'-f', 'rtsp' 两个参数重合了,检查一下文件位置,改为绝对路径试试

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7468063
  • 这篇博客你也可以参考下:python 中subprocess.Popen()的使用
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的问题和参考资料,我将为您提供一种解决问题的方案。

    首先,"FileNotFoundError: [WinError 2] 系统找不到指定的文件"错误通常是由于命令中使用的文件路径错误或文件不存在引起的。请按照以下步骤逐一尝试解决问题:

    1. 确保指定的文件存在:请检查command参数中指定的文件路径是否正确,并确保文件存在。您可以使用Python的os.path.exists()函数来检查文件路径。
    import os
    if not os.path.exists(file_path):
        # 错误处理逻辑
    
    1. 检查环境变量:请确认系统环境变量是否正确配置,并且可以在命令行中直接执行相应的命令。您可以使用Python的subprocess.check_output()函数来执行命令,并查看返回结果。
    import subprocess
    try:
        output = subprocess.check_output(command, shell=False)
    except subprocess.CalledProcessError as e:
        # 错误处理逻辑
    
    1. 使用绝对路径:尝试使用文件的绝对路径来替代相对路径,以确保能够正确找到文件。您可以使用Python的os.path.abspath()函数来获取文件的绝对路径。
    import os
    abs_file_path = os.path.abspath(file_path)
    self.pipe = subprocess.Popen(abs_file_path, shell=False, stdin=subprocess.PIPE)
    
    1. 设置工作目录:使用subprocess.Popen()函数的cwd参数,设置工作目录为文件所在的路径,可以避免相对路径引起的问题。
    import os
    work_dir = os.path.dirname(file_path)
    self.pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE, cwd=work_dir)
    
    1. 检查文件权限:确保文件有足够的权限被Python进程访问。您可以使用Python的os.access()函数来检查文件权限。
    import os
    if not os.access(file_path, os.R_OK):
        # 错误处理逻辑
    
    1. 执行命令时添加必要的参数:根据具体的命令需求,添加必要的参数,比如在执行可执行文件时可能需要指定工作目录、环境变量等。
    self.pipe = subprocess.Popen(command, shell=False, stdin=subprocess.PIPE, cwd=work_dir, env=my_env)
    
    1. 检查Python版本兼容性:某些命令可能与Python版本不兼容,可以尝试在不同的Python版本下执行命令。

    尝试以上优化方案后,如果问题仍然存在,请提供更多的上下文信息和详细的错误日志,以便更好地帮助解决问题。

    希望以上解决方案对您有所帮助!如果您有任何疑问,请随时提问。