OSError: 在使用subprocess.Popen时找不到文件或目录

5

我正在尝试获取视频剪辑的持续时间。但是无法获取文件。 这是我的代码:

import subprocess
import os
def getLength(input_video):
    result = subprocess.Popen('ffprobe -i input_video -show_entries format=duration -v quiet -of csv="p=0"', stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    output = result.communicate()
    return output[0]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
x = (os.path.join(BASE_DIR,'uploads/video.mkv'))
getLength(x)

这是我遇到的错误信息:
Traceback (most recent call last):
  File "/home/aman/Desktop/stream/src/stream/uploads/sadf.py", line 9, in <module>
    getLength(x)
  File "/home/aman/Desktop/stream/src/stream/uploads/sadf.py", line 4, in getLength
    result = subprocess.Popen('ffprobe -i input_video -show_entries format=duration -v quiet -of csv="p=0"', stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
[Finished in 0.1s with exit code 1]
[shell_cmd: "python" -u "/home/aman/Desktop/stream/src/stream/uploads/sadf.py"]
[dir: /home/aman/Desktop/stream/src/stream/uploads]
[path: /home/aman/bin:/home/aman/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]

你可能需要将命令拆分为列表。我记不清Popen是否允许命令作为字符串。 - FamousJameous
是的,如果我在我的Linux系统上运行 subprocess.Popen('ls -l'),我会得到与您相同的错误。如果我改为运行 subprocess.Popen('ls -l'.split()),它将正确运行。 - FamousJameous
谢谢@famoursjameous - Aman Agrawal
2个回答

8

你不能直接运行像那样的子进程subprocess.Popen,需要添加shell=True参数。

result = subprocess.Popen('ffprobe -i input_video -show_entries format=duration -v quiet -of csv="p=0"', stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True)

如果您将命令分成参数列表,那么您可以在不使用shell=True的情况下使用您所使用的方法。通常建议使用非shell方法:Python subprocess模块何时使用Shell=True

result = subprocess.Popen(['ffprobe', '-i', 'input_video', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv="p=0"'], stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

非常感谢 @artagel。 - Aman Agrawal
我在我的文件中使用了以下代码 subprocess32.Popen(['python','m2p21_contacts.py'], close_fds=False) 来创建到文件 'm2p21_contacts.py' 的子进程,但它正在等待直到 'm2p21_contacts.py' 完全执行完成。 - user8119231
我认为你应该提出一个新问题。但是,如果你正在调用另一个Python脚本,我无法想象为什么你要使用subprocess而不是导入它并调用你的函数。**编辑:除非它是不同的Python版本 :) - Artagel

0
对我来说,真正的错误是 /usr/local/bin/python 未定义,运行 sudo ln -s /usr/bin/python /usr/local/bin/python 可以解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接