我正在尝试定义一个在更大的程序中使用的函数,但是当我运行它时,我得到了这个输出:
追踪(最近一次通话): 文件“test.py”,第29行,in 打印tracknumber NameError:名称'tracknumber'未定义
如果我不把它写成函数(没有def)
,代码运行正常有什么想法吗?
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 :(得分:1)
您需要从函数返回值并将它们分配给全局范围内的变量,否则tracknumber
,artist
,title
将会提升NameError
不存在于全球范围内。
函数可以访问在全局范围(filename
)中定义的变量,但函数内定义的变量不能在其外部访问。
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 :(得分:1)
您在函数内部创建的变量是该函数的本地变量,因此当您尝试在函数外部访问它们时,它们将无法找到并且您将收到错误。
以下是有关如何解决此问题的两个选项:
返回您需要在函数外部使用的值,让调用者处理它们:
def metadata():
# all of your current code
# add this to the bottom
return tracknumber, artist, title
# save the returned values to global variables
tracknumber, artist, title = metadata()
使用全局语句,以便为函数中的变量赋值实际分配给全局范围:
def metadata():
global tracknumber, artist, title
# all of your current code
答案 2 :(得分:0)
在您的代码中,变量tracknumber,artist和title的范围是函数的本地范围。要访问这些变量,请将它们声明为全局变量或返回这些变量。