2016-07-20 9 views
1

Okay, ich habe versucht, ein einfaches Skript zum Herunterladen von Youtube-Videos mit pafy zu erstellen. Derzeit habe ich ein Problem mit der globalen Variablen video, die ich verwende, um zu speichern, was pafy.new('url') zurückgibt. Ist hier die beiden Funktionen, die ich verwenden:Python pafy global funktioniert nicht über eine Funktionsaufrufgrenze hinweg

video = {}; 

def downloadVideo(): 

    options = {}; 
    options['initialdir'] = 'C:\\'; 
    options['mustexist'] = False; 
    options['title'] = 'Download folder'; 

    dir_path = tkinter.filedialog.askdirectory(**options); 
    global video; 
    video.getbest(preftype="mp4").download(quiet=True, filepath=dir_path); 

def get(): 
    url = url_entry.get(); 

    if url == '': 
     return 

    global video; 
    video = pafy.new(url); 

    # Some code to display video info 

Zuerst verwende ich get() Funktion das Video von url_entry zu erhalten, die ein tkinter Eintrag Widget ist. So weit so gut, aber wenn ich downloadVideo() nennen bekomme ich diesen Fehler:

AttributeError: 'NoneType' object has no attribute 'download'

+0

Python 2 oder 3? Anstatt globals zu verwenden, ändern Sie 'get' in' return video' am Ende und ändern 'downloadVideo', um einen Parameter zu nehmen:' downloadVideo (video) '. Auf diese Weise müssen Sie sich nicht um lokale vs. globale Sorgen machen, und Sie können andere Probleme finden. Ich vermute, dass der Code, der 'get' und' downloadVideo' aufruft, 'video' so verändert, dass' getbest (...) 'None zurückgibt, woher der Fehler kommt. – cxw

+0

@cxw Python 3. Btw, der Code, der 'get() 'und' downloadVideo() 'aufruft, ändert' video' nicht. – DimChtz

+0

OK, danke. Ich stehe zu meinem ersten Kommentar: benutze keine Globals. Ansonsten sehe ich keine offensichtlichen Probleme. Wenn Sie die Globals ausschalten und immer noch Probleme haben, aktualisieren Sie die Frage mit dem neuen Code und rufen Sie mich an. – cxw

Antwort

0

das Problem in dieser Zeile gefunden:

video.getbest(preftype="mp4").download(quiet=True, filepath=dir_path); 

Dieses:

video.getbest(preftype="mp4") 

tatsächlich ein NoneType Objekt zurückgegeben da es keinen mp4 Stream enthielt. Also, es ist nicht genau ein Problem, es ist nur etwas, was ich überprüfen sollte, bevor Sie download() anrufen. Jetzt bekomme ich einfach alle Streams video.streams und downloade, was ich brauche oder lass es einfach die besten verfügbaren video.getbest().download() herunterladen.