- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 VTE 模块来运行脚本 bash:我有几个错误,其中之一是:
avconv version 9.11-6:9.11-2ubuntu2, Copyright (c) 2000-2013 the Libav developers
built on Mar 24 2014 06:12:33 with gcc 4.8 (Ubuntu 4.8.2-17ubuntu1)
: No such file or directory
这是我的 python 脚本的一部分:
def download(self, a, donnees=None):
adresse = self.champ.get_text()
self.v.fork_command('./pluzz.sh', '-u', adresse) # calling the bash script
[...]
def __init__(self):
self.v = vte.Terminal()
self.v.set_emulation('xterm')
self.v.show()
self.box1.add(self.v)
还有一段 bash 脚本:
echo -e "$VERT""DEBUT DU TRAITEMENT""$NORMAL"
#Recuperation de l' ID de l' emission
UserAgent='Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0'
ID=$(wget -q -U "${UserAgent}" "${URL}" -O - | grep -E "og:url.*content.*http://*" | sed 's+.*,\([0-9]*\).*+\1+g')
#wget du json conteant les infos
echo -e "$ROSE""-->RECUPERATION DU JSON""$NORMAL"
JSON="$(wget -q -U "${UserAgent}" "http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/?idDiffusion=${ID}&catalogue=Pluzz&callback=webserviceCallback_${ID}" -O - | sed 's+\\/+/+g')"
#Recuperation des infos
echo -e "$ROSE""-->TRAITEMENT DU JSON""$NORMAL"
DATE="$(echo "${JSON}" | sed 's+.*date_debut..\"\([^\"]*\)\".*+\1+g')"
PROG="$(echo "${JSON}" | sed 's+.*code_programme..\"\([^\"]*\)\".*+\1+g')"
M3U="$(echo "${JSON}" | sed 's+.*url..\"\([^\"]*m3u8\)\".*+\1+g')"
#Recuperation du master M3U et traitement
echo -e "$BLEU""-->RECUPERATION DU FICHIER VIDEO""$NORMAL"
M3U2="$(wget -q -U "'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0'" "${M3U}" -O - | grep -E ".*index_2.*")"
avconv -i "${M3U2}" -vcodec copy -acodec copy "${PROG}_${ID}.mkv"
bash 脚本在控制台中运行良好:
:~./pluzz.sh http://pluzz.francetv.fr/videos/coluche_un_clown_ennemi_d_etat.html
DEBUT DU TRAITEMENT
-->RECUPERATION DU JSON
-->TRAITEMENT DU JSON
-->RECUPERATION DU FICHIER VIDEO
avconv version 9.11-6:9.11-2ubuntu2, Copyright (c) 2000-2013 the Libav developers
built on Mar 24 2014 06:12:33 with gcc 4.8 (Ubuntu 4.8.2-17ubuntu1)
[hls,applehttp @ 0x1ebfe00] max_analyze_duration reached
Input #0, hls,applehttp, from 'http://ftvodhdsecz-f.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2014/S18/J5/101152365-20140502-,398,632,934,k.mp4.csmil/index_2_av.m3u8?null=':
Duration: 00:56:10.00, start: 0.100667, bitrate: 0 kb/s
Stream #0.0: Video: h264 (Main), yuv420p, 704x396 [PAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1: Audio: aac, 48000 Hz, stereo, fltp
Stream #0.2: Data: [21][0][0][0] / 0x0015
我希望我的解释很清楚......谢谢
编辑:我找到了解决方案:替换
self.v.fork_command('./pluzz.sh', '-u', adresse)
由
self.v.fork_command(None, ['/bin/bash', '-u', './pluzz.sh', adresse])
最佳答案
我的猜测是您的问题是由于:
self.v.fork_command('./pluzz.sh', '-u', adresse) # calling the bash script
假设有两件事:
但是对于 2.,脚本缺少 #!/bin/bash
shebang 头来告诉系统这是一个要执行的 shell 脚本,而对于 1. 你应该更好地使用绝对路径,或相对于当前模块文件的路径。
您应该使用相对于当前脚本的路径,或绝对路径:
import sys
import os
### if the pluzz script is in same directory as your python app
pluzz_script = os.path.join(os.path.dirname(sys.argv[0]), 'pluzz.sh')
### explicitely run bash, to have it run your script
self.v.fork_command('/bin/bash', pluzz_script, '-u', address)
编辑:重读您的帖子,看起来实际上并非如此。不过,您应该采纳我之前的建议,以避免在分发脚本后出现任何进一步的问题。
您的问题是实际上该文件尚未下载,或者无法写入,并且 avconv
无法访问它。很难判断出了什么问题,因为脚本不允许 wget
的输出通过。不过,您最好将该脚本转换为 python 并使用安全的临时目录来下载文件并进行计算。
这是您的脚本在 python 中的翻译:
# echo -e "$VERT""DEBUT DU TRAITEMENT""$NORMAL"
# retrieval of the show's id
from lxml import etree
import subprocess
import requests
import json
import os
### User defined values:
url='http://pluzz.francetv.fr/videos/doctor_who.html'
target_path=os.path.join(os.environ['HOME'], 'Downloads')
###
headers={'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0'}
##### ID=$(wget -q -U "${UserAgent}" "${URL}" -O - | grep -E "og:url.*content.*http://*" | sed 's+.*,\([0-9]*\).*+\1+g')
p = etree.HTML(requests.get(url, headers=headers).text)
show_id = p.xpath('//meta[@property="og:url"]/@content')[0].split(',')[-1].split('.')[0]
##### get the JSON containing the show's data
##### JSON="$(wget -q -U "${UserAgent}" "http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/?idDiffusion=${ID}&catalogue=Pluzz&callback=webserviceCallback_${ID}" -O - | sed 's+\\/+/+g')"
show_data_url = "http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/?idDiffusion={show}&catalogue=Pluzz&callback=webserviceCallback_{show}"
show_data = json.loads("".join(requests.get(show_data_url.format(show=show_id), headers=headers).text.split('(')[1:])[:-1])
# retrieve data from the json
##### DATE="$(echo "${JSON}" | sed 's+.*date_debut..\"\([^\"]*\)\".*+\1+g')"
##### PROG="$(echo "${JSON}" | sed 's+.*code_programme..\"\([^\"]*\)\".*+\1+g')"
##### M3U="$(echo "${JSON}" | sed 's+.*url..\"\([^\"]*m3u8\)\".*+\1+g')"
# date = show_data['diffusion']['date_debut']
# prog = show_data['code_programme']
# m3u = list(filter(lambda x: x['format'] == 'm3u8-download', j['videos']))[0]['url']
p = requests.get(list(filter(lambda x: x['format'] == 'm3u8-download', show_data['videos']))[0]['url'], headers=headers).text
# M3U retrieval
##### M3U2="$(wget -q "${M3U}" -O - | grep -E ".*index_2.*")"
video_url = list(filter(lambda l: "index_2" in l, p.split()))[0]
##### avconv -i "${M3U2}" -vcodec copy -acodec copy "${PROG}_${ID}.mkv"
dest_file = "{}_{}.mkv".format(show_data['code_programme'], show_id)
subprocess.call(['avconv', '-i', video_url, '-vcodec', 'copy', '-acodec', 'copy', os.path.join(target_path, dest_file)])
或者您可以使用来处理 avconv
的输出:
p = subprocess.Popen(['avconv', '-i', video_url, '-vcodec', 'copy', '-acodec', 'copy', os.path.join(target_path, dest_file)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
for line in out:
print(out)
这样您就可以在应用程序的 UI 中构建进度条,而不是丑陋的终端输出。
我构建了另一个版本的代码,它具有更好的设计,具有命令行参数解析器,并处理行输出以显示进度条:
HTH
关于python - 使用 VTE 模块运行脚本 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23562651/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!