Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python def(AttributeError:';str';对象没有属性';read';)_Python_Python 2.7_Function - Fatal编程技术网

Python def(AttributeError:';str';对象没有属性';read';)

Python def(AttributeError:';str';对象没有属性';read';),python,python-2.7,function,Python,Python 2.7,Function,正在尝试将以下内容转换为def,但执行可能不允许的操作。。。我做错了什么?如何才能做得更好 # Same for both import alsaaudio l_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default') r_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default

正在尝试将以下内容转换为def,但执行可能不允许的操作。。。我做错了什么?如何才能做得更好

# Same for both
import alsaaudio
l_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default')
r_input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, card='default')
#

l, data = l_input.read()
if l > 0:
  # transform data to logarithmic scale
  lin_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo)
  # Calculate value
  lin_vu = (min(max(int(lin_vu*15),0),15))
l, data = r_input.read()
if l > 0:
  # transform data to logarithmic scale
  rin_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo)
  # Calculate value
  rin_vu = (min(max(int(rin_vu*15),0),15))
我希望这样做,因为我需要读取4个值,而不仅仅是列出的两个值:

def readvu( src ):
  l, data = src.read()
  if l > 0:
    # transform data to logarithmic scale
    l_vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo)
    # Calculate value
    l_vu = (min(max(int(l_vu*15),0),15))

lin_vu = readvu( 'l_input' );
rin_vu = readvu( 'r_input' );

但这会产生上述错误。

解决方案是显而易见的:如果调用
readvu('l_input')
,您的
src
将变成
'l_input'
,并且
.read()
从中读取将失败

电话应该是这样的

lin_vu = readvu(l_input)
rin_vu = readvu(r_input)

它传递的是实际的变量,而不是字符串。

思想的变化让我想到了以下几点:

# Convert log scale, calculate value & max
def vu_log(data,vu_max,max_t):
  # transform data to logarithmic scale
  vu = (math.log(float(max(audioop.max(data, 2),1)))-log_lo)/(log_hi-log_lo)
  # Calculate value
  vu = (min(max(int(vu*15),0),15))
  if vu >= vu_max:
    max_t = (3 * vu_fps) # keep max for 3 seconds
    vu_max = vu
  else:
    max_t = max(0, max_t-1) # Reduce max timer by 1 until 0
  return (vu,vu_max,max_t);

# Fetch Left input VU from ALSA
l, data = l_input.read()
if l > 0:
  # Transform data to logarithmic scale and calculate value
  lin = vu_log(data,lin_max,lin_t)
  lin_vu = lin[0]  # Desired value
  lin_max = lin[1] # Maximum value (last 3 sec)
  lin_t = lin[2]   # Used for tracking age of lin_max

建设性建议总是受欢迎的…:)

请提供stacktrace,这是显而易见的。您正在调用
readvu('l_input')
,参数为
readvu
。稍后,在
readvu
中,您正试图调用字符串(
src
现在是字符串)上的
read
!有时候,答案太简单了,你自己都看不出来……:)谢谢你
lin_-vu,lin_-max,lin_-t=vu-log(…)
更短。而且
返回vu,vu-max,max-t
更多的是括号和分号谢谢你,我不知道。