Python定时任务线程报错TypeError: 'module'对象不可调用,求排查
问题原因及解决方案
错误根源
你碰到的 TypeError: 'module' object is not callable 问题,核心原因很明确:你把整个Python模块对象直接传给了线程的target参数,但模块本身是不能直接被调用的。
在你的代码里,activity_url_collector 和 storage_data_collector 是你导入的模块(对应同目录下的.py文件),而 threading.Thread(target=job_func) 要求 job_func 必须是一个可调用对象——比如函数、类的实例方法这类能加括号执行的东西。直接传模块过去,线程执行时自然会触发调用错误。
解决方法
你需要明确指定模块里要执行的入口函数,通常每个子模块都会定义一个专门的执行函数(比如main()),具体步骤如下:
第一步:给子模块添加可调用的入口函数
比如在 activity_url_collector.py 里,需要把你的采集逻辑封装到一个函数中,示例代码:
# activity_url_collector.py def main(): # 这里写你的URL采集逻辑 print("正在执行activity_url_collector任务") if __name__ == "__main__": main()
storage_data_collector.py 同理,也要封装对应的入口函数(比如同样用main(),或者你自定义的函数名)。
第二步:修改index.py的调度代码
把原来的模块引用,改成模块中具体函数的引用:
import schedule import time import psycopg2 import threading import activity_url_collector import storage_data_collector def main(): def run_threaded(job_func): job_thread = threading.Thread(target=job_func) job_thread.start() # 替换成模块里的具体入口函数 schedule.every(3).minutes.do(run_threaded, activity_url_collector.main) schedule.every(3).minutes.do(run_threaded, storage_data_collector.main) schedule.run_all() print('Post-Processing-Application is running') while True: schedule.run_pending() time.sleep(1) if __name__=="__main__": main()
如果你的子模块入口函数不是main(),而是其他名字(比如start_collection()),只需要把代码里的.main改成对应的函数名就行。
额外建议
如果你的子模块目前没有单独的入口函数,建议重构代码把业务逻辑封装到函数里——这不仅符合Python模块化的最佳实践,还能避免这类调用错误,后续维护也更方便。
内容的提问来源于stack exchange,提问作者el323
相关产品推荐
相关产品推荐

