2014-05-09 22 views
1

我試圖使用VTE模塊運行腳本的bash: 我有幾個錯誤, 其中之一是:運行腳本的bash使用VTE模塊

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" 

的BAS^h腳本在控制檯運行良好:

:~./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) 

by

self.v.fork_command(None, ['/bin/bash', '-u', './pluzz.sh', adresse]) 

回答

1

個我的猜測是,你的問題是由於:

self.v.fork_command('./pluzz.sh', '-u', adresse) # calling the bash script 

它假定兩兩件事:

  1. 腳本是在同一目錄中,其中應用程序已經從啓動;
  2. 該腳本是可執行的,並且可以運行作爲獨立

但對於2,腳本缺少#!/bin/bash認領頭告訴系統它是一個要執行的外殼腳本,以及用於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,並使用安全的臨時目錄下載文件並解決。

這是你的腳本的翻譯蟒蛇:

# 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) 

,所以你可以建立應用程序的用戶界面一個進度條,而不是一個醜陋的終端輸出。

我已經建立了具有更好的設計代碼的另一個版本,有一個命令行參數解析,並處理線輸出到顯示進度:

HTH

+0

感謝您的幫助,是的,ID不是wget的dwld。 – Guillaume

+0

你的代碼的結果是:[code] p:l:沒有這樣的文件或目錄[/ code] – Guillaume

+0

如果你想查看這兩個代碼的總數:https://www.dropbox.com/s/c9j0d21f4prhpaz/ dPluzz_v2.1.py.tar.gz – Guillaume