IndexError: list index out of range [HILFE]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MadPy
User
Beiträge: 3
Registriert: Samstag 6. Juli 2019, 10:28

Hallo,

bin ziemlich neu zu Python und habe einen YT Downloader Script geschrieben welches von einer txt Datei die url's nimmt und sie nachhinein downloadet.
Beim ausführen des Scripts habe ich keine Probleme, doch ich habe es zu exe umgewandelt durch Pyinstaller und bekomme jedes mal beim Ausführen der exe Datei einen "IndexError: index of list out of range".
Bild
Bild

Und danach schließt sich das Programm.

Hat jemand vielleicht eine Lösung?


Vielen Dank im Voraus.


PyInstaller Log:

Code: Alles auswählen

C:\Users\MadPy\Desktop\downloader.py>pyinstaller dl.py
69 INFO: PyInstaller: 3.4
69 INFO: Python: 3.5.0
70 INFO: Platform: Windows-10.0.17134
71 INFO: wrote C:\Users\MadPy\Desktop\downloader.py\dl.spec
73 INFO: UPX is not available.
75 INFO: Extending PYTHONPATH with paths
['C:\\Users\\MadPy\\Desktop\\downloader.py',
 'C:\\Users\\MadPy\\Desktop\\downloader.py']
75 INFO: checking Analysis
75 INFO: Building Analysis because Analysis-00.toc is non existent
75 INFO: Initializing module dependency graph...
77 INFO: Initializing module graph hooks...
79 INFO: Analyzing base_library.zip ...
2402 INFO: running Analysis Analysis-00.toc
2727 INFO: Caching module hooks...
2732 INFO: Analyzing C:\Users\MadPy\Desktop\downloader.py\dl.py
5945 INFO: Loading module hooks...
5946 INFO: Loading module hook "hook-xml.py"...
5981 INFO: Loading module hook "hook-xml.etree.cElementTree.py"...
5982 INFO: Loading module hook "hook-encodings.py"...
6057 INFO: Loading module hook "hook-pydoc.py"...
6114 INFO: Looking for ctypes DLLs
6208 INFO: Analyzing run-time hooks ...
6223 INFO: Looking for dynamic libraries
6309 INFO: Looking for eggs
6309 INFO: Using Python library c:\users\MadPy\appdata\local\programs\python\python35\python35.dll
6309 INFO: Found binding redirects:
[]
6315 INFO: Warnings written to C:\Users\MadPy\Desktop\downloader.py\build\dl\warn-dl.txt
6466 INFO: Graph cross-reference written to C:\Users\MadPy\Desktop\downloader.py\build\dl\xref-dl.html
6497 INFO: checking PYZ
6498 INFO: Building PYZ because PYZ-00.toc is non existent
6498 INFO: Building PYZ (ZlibArchive) C:\Users\MadPy\Desktop\downloader.py\build\dl\PYZ-00.pyz
7159 INFO: Building PYZ (ZlibArchive) C:\Users\MadPy\Desktop\downloader.py\build\dl\PYZ-00.pyz completed successfully.
7187 INFO: checking PKG
7188 INFO: Building PKG because PKG-00.toc is non existent
7188 INFO: Building PKG (CArchive) PKG-00.pkg
7202 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
7203 INFO: Bootloader c:\users\MadPy\appdata\local\programs\python\python35\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
7204 INFO: checking EXE
7204 INFO: Building EXE because EXE-00.toc is non existent
7204 INFO: Building EXE from EXE-00.toc
7205 INFO: Appending archive to EXE C:\Users\MadPy\Desktop\downloader.py\build\dl\dl.exe
7208 INFO: Building EXE from EXE-00.toc completed successfully.
7210 INFO: checking COLLECT
7210 INFO: Building COLLECT because COLLECT-00.toc is non existent
7211 INFO: Building COLLECT COLLECT-00.toc
7507 INFO: Building COLLECT COLLECT-00.toc completed successfully.
Benutzeravatar
noisefloor
User
Beiträge: 4191
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

...und willkommen im Forum.

Bitte Code _nicht_ als Screenshot posten, sondern in einem Python Code Block. Den bekommst du, wenn du im vollständigen Editor auf die Schaltfläche </> klickst.

Zum Fehler: der einzige Indexzugriff in Zeile 49 ist `argv[1]` - was auch immer `argv` ist, dass geht auf dem Codeschnipsel ja nicht hervor. Jedenfalls ist bei dir `argv` wohl eine Liste mit nur einem Element und dann existiert argv[1] nicht, weil dass das 2. Element ist.

Wie rufst du denn das Skript aus? Und wie die kompilierte EXE?

Gruß, noisefloor
MadPy
User
Beiträge: 3
Registriert: Samstag 6. Juli 2019, 10:28

Hallo noisefloor,
vielen Dank für die rasche Antwort.

hier ist der Code:

Code: Alles auswählen

from __future__ import unicode_literals
import youtube_dl
import os
from sys import argv

os.system("cls")


#Download config of yt

download_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(title)s.%(ext)s',
    'nocheckcertificate': True,
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192'
    }]
}

#Songs dir
if not os.path.exists('Songs'):
    os.mkdir('Songs')
else:
    os.chdir('Songs')

#Download Songs
print('\u001b[32mDownloading..\u001b[37m')

with youtube_dl.YoutubeDL(download_options) as dl:
    with open('../' + argv[1], 'r') as f:
        for song_url in f:
            dl.download([song_url])
Das ist alles. Da wird die dir "Songs" kreiert, springt dann einmal zurück und greift auf "songs.txt" um die Links von der Datei abzulesen, dort sind 3 Links drin (in meinem Beispiel).
Anschließend werden die Songs in dem "Songs" Ordner gespeichert.

Wenn ich das Skript mit oder ohne als Admin ausführe funktioniert es. Doch die Exe Datei nicht, da bekomme ich immer die Fehlermeldung IndexError.
Ich habe schon einiges ausprobiert, zB argv[0], argv[2] oder habe das '../' gelöscht damit die Tracks direkt im Pfad heruntergeladen werden.

Doch jedesmal habe ich die Fehlermeldung bekommen.


Ich hoffe dies waren jetzt einige Infos.

Liebe Grüße,
MadPy
Benutzeravatar
noisefloor
User
Beiträge: 4191
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mit `sys.argv` greifst du auf die Kommandozeilenargumente zu, die du dem Python Skript mitgibst. Also bei dir wäre `python deine_datei.py songs.txt` `argv[1]` gleich `songs.txt`.

Ich vermute mal stark, dass bei der EXE-Datei die Argumente ignoriert bzw. nicht durchgereicht werden, weswegen `argv[1]` nicht existiert.
Da ich kaum Windows zum Programmieren nutze und wenn ich Python-Skripte nicht in eine EXE-Datei packe (BTW: warum überhaupt?) kann ich dir nicht sagen, ob es da einen Workaround gibt oder du besser z.B. das argparse Modul nimmst oder ....?

Übrigens: du verwendest Python 2, dass Ende 2019 ohne Support. Also besser dein Programm auf Python 3 umschreiben.

Gruß, noisefloor
MadPy
User
Beiträge: 3
Registriert: Samstag 6. Juli 2019, 10:28

Hallo noisefloor,

ja du hast Recht ! Das war dumm von mir :D

Ich hab die exe Datei jetzt über die CMD ausgeführt und dementsprechende Args, nun funktioniert es.

Vielen Dank nochmal für deine Hilfe!

Ein schönes Wochenende noch.

LG,
MadPy
Antworten