Ich versuche, eine Funktion zu definieren, die in einem größeren Programm verwendet werden soll, aber wenn ich dies ausführe, erhalte ich folgende Ausgabe:

Traceback (letzter Aufruf zuletzt): Datei "test.py", Zeile 29, in gedruckter Tracknummer NameError: Name 'Tracknummer "ist nicht definiert

Der Code läuft gut, wenn ich ihn nicht als Funktion schreibe (ohne def)

Irgendeine Idee?

import subprocess

filename = raw_input("Path?")

def metadata():

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=tracknumber", filename], stdout=subprocess.PIPE)
    tracknumber, error = pipe.communicate()
    tracknumber = tracknumber.replace("TRACKNUMBER=", "")    
    tracknumber = tracknumber.rstrip()
    if int(tracknumber) < 10:
        tracknumber = "0" + tracknumber

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=title", filename], stdout=subprocess.PIPE)
    title, error = pipe.communicate()
    title = title.replace("TITLE=", "")
    title = title.rstrip()

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=artist", filename], stdout=subprocess.PIPE)
    artist, error = pipe.communicate()
    artist =  artist.replace("ARTIST=", " - ")
    artist = artist.rstrip()

metadata()

print tracknumber
print artist
print title
0
baldurmen 6 Dez. 2013 im 09:14

2 Antworten

In Ihrem Code sind der Bereich der Variablen Tracknummer, Künstler und Titel für die Funktion lokal. Um auf diese Variablen zuzugreifen, deklarieren Sie sie entweder als globale Variablen oder geben Sie diese Variablen zurück.

0
insti 6 Dez. 2013 im 05:27

Sie müssen Werte von der Funktion zurückgeben und sie Variablen im globalen Bereich zuweisen, andernfalls werden tracknumber, artist, title NameError auslösen, da sie nicht vorhanden sind im globalen Geltungsbereich.

Eine Funktion kann auf Variablen zugreifen, die im globalen Bereich definiert sind (filename), aber auf Variablen, die innerhalb einer Funktion definiert sind, kann nicht außerhalb dieser Funktion zugegriffen werden.

def metadata():

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=tracknumber", filename], stdout=subprocess.PIPE)
    tracknumber, error = pipe.communicate()
    ...
    ... 
    artist = artist.rstrip()
    return tracknumber, artist, title  #return variables at end

tracknumber, artist, title = metadata()

print tracknumber
print artist
print title
1
Ashwini Chaudhary 6 Dez. 2013 im 05:15