我正在尝试修复以下错误
An exception has occurred, use %tb to see the full traceback.
SystemExit: 1
在以下python代码中:
import sys
import random
import math
然后去:
try:
#Sanity check
if (len(sys.argv)<4):
print ("Ejecutar con la siguiente linea: ./validador <ruta_tareas> <ruta_empleados> <ruta_solucion>")
sys.exit(1)
ruta_tareas=sys.argv[1]
ruta_empleados=sys.argv[2]
ruta_solucion=sys.argv[3]
habilidad_empleados=[]
sueldo_diario_empleado=[]
dedicacion_diaria_diponible_empleado=[]
esfuerzo_requerido_tarea=[]
nombres_tareas=[]
nombre_empleados=[]
costo_proyecto=0
tiempo_solucion_proyecto=0
# se sabe que son 4 lineas
archivo_tareas=open(ruta_tareas)
lineasTareas=archivo_tareas.readlines()
deadLine=lineasTareas[0]
nombres_tareas=lineasTareas[1].strip().split(" ")
esfuerzo_requerido_tarea=lineasTareas[2].strip().split(" ")
# se sabe que son 4 lineas
archivo_empleados=open(ruta_empleados)
lineasEmpleados=archivo_empleados.readlines()
nombre_empleados=lineasEmpleados[0].strip().split(" ")
dedicacion_diaria_diponible_empleado=lineasEmpleados[1].strip().split(" ")
habilidad_empleados=lineasEmpleados[2].strip().split(" ")
sueldo_diario_empleado=lineasEmpleados[3].strip().split(" ")
# se convierten a entero
dedicacion_diaria_diponible_empleado = map(int, dedicacion_diaria_diponible_empleado)
sueldo_diario_empleado = map(int, sueldo_diario_empleado)
deadLine=int(deadLine)
esfuerzo_requerido_tarea = map(int, esfuerzo_requerido_tarea)
# se convierte a float
habilidad_empleados = map(float, habilidad_empleados)
# se levanta la solucion del archivo
matriz_solucion=[]
archivo_solucion=open(ruta_solucion)
solucion_empleados_tareas=[]
solucion_empleados=[]
solucion_tareas=[]
for line in archivo_solucion.readlines():
empleados_tareas=line.strip().split(" ")
if( not (empleados_tareas[0] in nombre_empleados)):
print ("No existe en la instancia el empleado: " + empleados_tareas[0])
sys.exit(1)
solucion_empleados.append(empleados_tareas[0])
for i in range(1,len(empleados_tareas)):
if( not (empleados_tareas[i] in nombres_tareas)):
print ("No existe en la instancia la terea: " + empleados_tareas[i])
sys.exit(1)
solucion_tareas.append(empleados_tareas[i])
for i in range(0,len(solucion_empleados)):
for j in range(i+1,len(solucion_empleados)):
if(solucion_empleados[i]==solucion_empleados[j]):
print ("Empleado repetido: " + solucion_empleados[i])
sys.exit(1)
for i in range(0,len(solucion_tareas)):
for j in range(i+1,len(solucion_tareas)):
if(solucion_tareas[i]==solucion_tareas[j]):
print ("Tarea asignada más de una vez: " + solucion_tareas[i])
sys.exit(1)
# todas las tareas asignadas
if(len(solucion_tareas)!=len(nombres_tareas)):
print ("La cantidad de tareas asignadas es distinta a la cantidad de tareas de la instancia.")
sys.exit(1)
for i in range(0,len(nombres_tareas)):
if( not (nombres_tareas[i] in solucion_tareas)):
print ("Tarea no asignada " + nombres_tareas[i])
sys.exit(1)
costo_total=0
archivo_solucion=open(ruta_solucion)
maximo_tiempo=0
tiempo_en_dias=0
# se hacen los calculos con la informacion en los archivos
for line in archivo_solucion.readlines():
empleados_tareas=line.strip().split(" ")
indice_empleado = nombre_empleados.index(empleados_tareas[0])
tiempo_en_horas=0
for i in range(1,len(empleados_tareas)):
indice_tarea = nombres_tareas.index(empleados_tareas[i])
tiempo_en_horas=tiempo_en_horas+(esfuerzo_requerido_tarea[indice_tarea] / (0.5 + habilidad_empleados[indice_empleado]))
tiempo_en_dias= int(math.ceil(tiempo_en_horas/dedicacion_diaria_diponible_empleado[indice_empleado]))
costo_total=costo_total+sueldo_diario_empleado[indice_empleado]*tiempo_en_dias
if(tiempo_en_dias>maximo_tiempo):
maximo_tiempo=tiempo_en_dias
if(maximo_tiempo<=deadLine):
# todo OK!
print (costo_total,maximo_tiempo)
else:
print ("No cumple con el tiempo máximo de finalización ({0} > {1}).".format(maximo_tiempo, deadLine))
sys.exit(1)
except IOError as error:
print (error)
每次尝试运行它时,我都会失败,并且无法意识到我犯了什么错误。
我在Anaconda发行版和Spyder IDE中运行代码。我认为这可能与错误有关。
关于如何解决该错误的任何想法?
谢谢
有人可以告诉我代码有什么问题吗?
谢谢
答案 0 :(得分:2)
此异常SystemExit(1)
意味着代码执行良好,直到到达sys.exit(1)
。
现在,您的代码中有多个sys.exit(1)
。要知道代码到达了哪个代码,您必须检查输出或在winpdb
答案 1 :(得分:0)
您应该考虑引发异常,而不是在各处使用sys.exit
if( not (empleados_tareas[i] in nombres_tareas)):
raise Exception("No existe en la instancia la terea: " + empleados_tareas[i])
这将为您提供更多详细信息。然后,您还可以更轻松地使用pdb进行调试
python -m pdb ./validador <args>
到达异常时将中断。