sys.argv [1])IndexError:列表索引超出范围

时间:2017-06-02 08:26:38

标签: python

我刚开始学习python。当我执行下面的代码时,我收到一个错误。它告诉我们 Traceback(最近一次调用最后一次):   文件" predict_1.py",第87行,in     主(sys.argv中[1]) IndexError:列表索引超出范围

非常感谢任何帮助。感谢您的阅读!

#import modules
import sys
import tensorflow as tf
from PIL import Image,ImageFilter

def predictint(imvalue):
  """
  This function returns the predicted integer.
  The imput is the pixel values from the imageprepare() function.
  """

  # Define the model (same as when creating the model file)
  x = tf.placeholder(tf.float32, [None, 784])
  W = tf.Variable(tf.zeros([784, 10]))
  b = tf.Variable(tf.zeros([10]))
  y = tf.nn.softmax(tf.matmul(x, W) + b)

  init_op = tf.initialize_all_variables()
  saver = tf.train.Saver()

  """
  Load the model.ckpt file
  file is stored in the same directory as this python script is started
  Use the model to predict the integer. Integer is returend as list.

  Based on the documentatoin at
  https://www.tensorflow.org/versions/master/how_tos/variables/index.html
  """
  with tf.Session() as sess:
      sess.run(init_op)
      new_saver = tf.train.import_meta_graph('model.ckpt.meta')
  new_saver.restore(sess, "model.ckpt")
      #print ("Model restored.")

      prediction=tf.argmax(y,1)
      return prediction.eval(feed_dict={x: [imvalue]}, session=sess)


def imageprepare(argv):
  """
  This function returns the pixel values.
  The imput is a png file location.
  """
  im = Image.open(argv).convert('L')
  width = float(im.size[0])
  height = float(im.size[1])
  newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixels

  if width > height: #check which dimension is bigger
      #Width is bigger. Width becomes 20 pixels.
      nheight = int(round((20.0/width*height),0)) #resize height according to ratio width
      if (nheigth == 0): #rare case but minimum is 1 pixel
          nheigth = 1  
      # resize and sharpen
      img = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
      wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozition
      newImage.paste(img, (4, wtop)) #paste resized image on white canvas
  else:
      #Height is bigger. Heigth becomes 20 pixels. 
      nwidth = int(round((20.0/height*width),0)) #resize width according to ratio height
      if (nwidth == 0): #rare case but minimum is 1 pixel
          nwidth = 1
       # resize and sharpen
      img = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
      wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozition
      newImage.paste(img, (wleft, 4)) #paste resized image on white canvas

  #newImage.save("sample.png")

  tv = list(newImage.getdata()) #get pixel values

  #normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
  tva = [ (255-x)*1.0/255.0 for x in tv] 
  return tva
  #print(tva)

def main(argv):
  """
  Main function.
  """
  imvalue = imageprepare(argv)
  predint = predictint(imvalue)
  print (predint[0]) #first value in list

  if __name__ == "__main__":
  main(sys.argv[1])

2 个答案:

答案 0 :(得分:0)

您应该为脚本提供一个参数,即将其称为

predict_1.py path_to_your_file

答案 1 :(得分:0)

首先,在按索引访问列表中的项之前,您始终必须检查列表的边界或捕获异常并处理“超出范围”的情况(在案例中为IndexError)。

其次,更好的方法是开始使用argparse模块。还有更简单的getopt模块,您可以在Web,Python标准文档等中找到它们的许多示例。它们允许您的脚本具有更方便的命令行参数,例如在Unix工具中(可选,位置,使用默认值等,等等。)