【问题标题】:sys.argv[1]) IndexError: list index out of range [duplicate]sys.argv [1])IndexError:列表索引超出范围[重复]
【发布时间】:2017-11-03 14:05:45
【问题描述】:

我刚开始学习python。当我执行下面的代码时,我得到一个错误。它告诉我们 回溯(最近一次通话最后): 文件“predict_1.py”,第 87 行,在 主要(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])

【问题讨论】:

  • 不,this 代码只会给出缩进错误。发布 Python 代码时,您需要准确地复制缩进。严重缩进的 Python 代码是无稽之谈。
  • 请阅读How to Ask 并尝试提供minimal reproducible example - 目前您的代码存在严重的缩进问题(很可能是由于格式问题)。
  • 为什么我们需要查看所有代码?其中大部分与此错误无关。你是如何运行脚本的?您是否在命令行中提供了正确的 imageprepare 参数字符串?
  • 您的错误清楚地表明您尝试访问第二个命令行参数(sys.argv[1]),这显然不存在,因此抛出IndexError

标签: python


【解决方案1】:

你应该为你的脚本提供一个参数,即像这样称呼它

predict_1.py path_to_your_file

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-12
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2015-06-20
      相关资源
      最近更新 更多