2017-03-31 9 views
2

我想获得视频剪辑的持续时间。但它无法获取文件。 这里是我的代码:OSError:没有这样的文件或目录使用子进程.Popen

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] 
+0

您可能需要将命令拆分为列表。我不记得'Popen'是否允许命令作为字符串。 – FamousJameous

+0

是的,如果我在我的linux系统上运行'subprocess.Popen('ls -l')',我得到和你一样的错误。如果我运行'subprocess.Popen('ls -l'.split())'它运行正常。 – FamousJameous

+0

thx @famoursjameous –

回答

2

您不能运行subprocess.Popen像一个字符串,不添加壳=真。

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的方法。通常推荐使用非外壳方法:When to use Shell=True for Python subprocess module

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

thx非常多@artagel –

+0

我在我的文件中使用了下面的代码subprocess32.Popen(['python','m2p21_contacts.py'],close_fds = False)来创建子文件'm2p21_contacts.py'但它正在等待,直到完成执行'm2p21_contacts.py' – user8119231

+0

我想你应该问一个新问题。但是..如果你正在调用另一个python脚本,我无法想象你为什么要对它进行子处理,而不是只导入它并调用你的函数。 **编辑:除非它是一个不同的Python版本:) – Artagel

相关问题