Estérfano Lopes
Estérfano Lopes

Reputation: 35

Python get 'object is not callable' with 2 threads

When i run the code below, i got an exception

# System
import time
import logging
import sys
import os
import threading
# cv2 and helper:
import cv2

class inic_thread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):
        print "Starting " + self.name
        if self.counter == 1: capture_continuos()
        elif self.counter == 2: face_search()

def capture_continuos():
    #os.system('python capture_continuos.py')
    while(1):    
        print 'a'

def face_search():
    # atributes
    pool = []
    path_pool = './pool/'

    while(1):
        pool_get = os.listdir(path_pool)
        if len(pool_get) > 0:
            #print(str(len(pool_get))+' images in the pool')
            for image in pool_get:
                print(image)
                os.system('python face_search.py -i '+str(image))
        else:
            print('Empty Pool')

try:
    capture_continuos = inic_thread(1, "capture_continuos_1", 1)
    face_search_2 = inic_thread(2, "face_search_2", 2)

    capture_continuos.start()
    face_search_2.start()
except:
    print("Error: unable to start thread")  

But it don't make sense to me, because one of the threads run normal, (face_search) but the other one give this exception.

Starting capture_continuos_1
Exception in thread capture_continuos_1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "main.py", line 44, in run
    if self.counter == 1: capture_continuos()
TypeError: 'inic_thread' object is not callable

What i'm doing wrong? I run in a Raspberry Pi 3 model B with Ubuntu MATE 14.04; Python 2.7.12

Upvotes: 1

Views: 3656

Answers (1)

Vsevolod Kulaga
Vsevolod Kulaga

Reputation: 676

At the bottom of your script you redefine variable capture_continuos assigning thread object to it.

Also as was mentioned to terminate thread it's better to call os._exit() instead of sys.exit().

Upvotes: 1

Related Questions