我在Archlinux机器上有一个与Redis服务器一起运行的Celery实例。 在这种情况下,我定义了一些每X分钟执行一次的任务。日程安排正常(如果我检查日志,则正在调用任务),但是有一个任务输出错误。 任务是运行另一个python脚本。 如果我手动运行此脚本,它将运行完美。但是当芹菜尝试执行它时,我收到此错误:
WARNING/ForkPoolWorker-93] Exception in thread Thread-6:
Traceback (most recent call last):
File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib64/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
TypeError: 'int' object is not callable
tasks.py是:
@periodic_task(
run_every=(crontab(minute='*/15')),
name="sm37_auto",
ignore_result=True
)
def sm37_auto():
comando_sm37 = os.system("python /home/user/sm37.py")
background_thread=threading.Thread(target=comando_sm37)
background_thread.start()
return 'ejecuta SM37 ok'
有人可以帮我吗?
答案 0 :(得分:0)
我想,您在说的是/home/user/sm37.py
,它非常有效。脚本task.py
也可以很好地执行,因为它没有什么要执行的:语法上该函数是正确的。
问题是,当您启动线程时,需要以target
的形式传递可执行文件,而传递的是返回值。考虑进行更改:
def sm37_thread():
comando_sm37 = os.system("python /home/user/sm37.py")
def sm37_auto():
background_thread=threading.Thread(target=sm37_thread)
background_thread.start()
return 'ejecuta SM37 ok'
答案 1 :(得分:0)
这里:
comando_sm37 = os.system("python /home/user/sm37.py")
这将执行/home/user/sm37.py脚本并返回进程退出状态,该状态为整数错误代码(其中0
表示“没有错误”,而其他所有内容都是错误)。
然后您拥有:
background_thread=threading.Thread(
target=comando_sm37
)
您尝试在其中创建线程的地方(为什么要在这种情况下创建线程超出了我的想象,但这是另一个主题),并传递一个整数作为目标可调用对象。
总而言之,这段代码毫无意义。
使用os.system
执行Python脚本已经很成问题了(Python代码可以导入其他python代码,您不需要os.system
),但是,您可能有这样做的理由(旧版代码,无论如何...)。但实际上是从芹菜任务开始线程?