You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:52