折腾:
期间,用代码:
<code># celery_task.py from celery import Celery import os # app = Celery('tasks', broker='redis://localhost//') app = Celery('tasks', broker='redis://localhost') @app.task() def add(x, y): return x + y @app.task() def deleteTmpAudioFile(filename): # audioTmpFolder = app.config["AUDIO_TEMP_FOLDER"] print("deleteTmpAudioFile: filename=%s", filename) audioTmpFolder = "tmp/audio" print("audioTmpFolder=%s" % audioTmpFolder) curFolderAbsPath = os.getcwd() #'/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo/server' print("curFolderAbsPath=%s" % curFolderAbsPath) audioTmpFolderFullPath = os.path.join(curFolderAbsPath, audioTmpFolder) print("audioTmpFolderFullPath=%s" % audioTmpFolderFullPath) tempAudioFullname = os.path.join(audioTmpFolderFullPath, filename) #'/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo/server/tmp/audio/2aba73d1-f8d0-4302-9dd3-d1dbfad44458.mp3' if os.path.isfile(tempAudioFullname): os.remove(tempAudioFullname) print("Ok to delete file %s" % tempAudioFullname) else: print("No need to remove for not exist file %s" % tempAudioFullname) </code>
然后参考:
celery.app.task — Celery 4.1.0 documentation
去调用,结果出错
<code>➜ server python Python 3.6.4 (default, Mar 22 2018, 13:54:22) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import celery_task >>> from celery_task import deleteTmpAudioFile >>> deleteTmpAudioFile.apply_async(args=("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"), countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 518, in apply_async check_arguments(*(args or ()), **(kwargs or {})) TypeError: deleteTmpAudioFile() takes 1 positional argument but 40 were given </code>
换成:
<code>>>> deleteTmpAudioFile.apply_async(args="98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3", countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 518, in apply_async check_arguments(*(args or ()), **(kwargs or {})) TypeError: deleteTmpAudioFile() takes 1 positional argument but 40 were given </code>
继续:
<code>>>> deleteTmpAudioFile.apply_async(args={"filename":"98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"}, countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 536, in apply_async **options File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/base.py", line 729, in send_task root_id, parent_id, shadow, chain, File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/amqp.py", line 316, in as_task_v2 raise TypeError('task args must be a list or tuple') TypeError: task args must be a list or tuple </code>
* args (Tuple) – The positional arguments to pass on to the task.
* kwargs (Dict) – The keyword arguments to pass on to the task.
celery apply_async TypeError takes 1 positional argument but 40 were given
celery apply_async TypeError takes 1 positional argument
python – TypeError: method() takes 1 positional argument but 2 were given – Stack Overflow
celery apply_async 参数
#sora#celery笔记——call the task – Hochikong的Blog
<code>>>> deleteTmpAudioFile.apply_async(args="98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3", countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 518, in apply_async check_arguments(*(args or ()), **(kwargs or {})) TypeError: deleteTmpAudioFile() takes 1 positional argument but 40 were given </code>
<code>>>> deleteTmpAudioFile.apply_async(args=(98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3), countdown=10) File "<stdin>", line 1 deleteTmpAudioFile.apply_async(args=(98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3), countdown=10) ^ SyntaxError: invalid syntax </code>
<code>>>> deleteTmpAudioFile.apply_async(("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"), countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 518, in apply_async check_arguments(*(args or ()), **(kwargs or {})) TypeError: deleteTmpAudioFile() takes 1 positional argument but 40 were given </code>
<code>>>> deleteTmpAudioFile.apply_async("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3", countdown=10) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 518, in apply_async check_arguments(*(args or ()), **(kwargs or {})) TypeError: deleteTmpAudioFile() takes 1 positional argument but 40 were given </code>
<code>>>> deleteTmpAudioFile.apply_async("a") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 536, in apply_async **options File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/base.py", line 729, in send_task root_id, parent_id, shadow, chain, File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/amqp.py", line 316, in as_task_v2 raise TypeError('task args must be a list or tuple') TypeError: task args must be a list or tuple </code>
始终不行。
celery apply_async 用法
<code>>>> deleteTmpAudioFile.apply_async(("a")) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/task.py", line 536, in apply_async **options File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/base.py", line 729, in send_task root_id, parent_id, shadow, chain, File "/Users/crifan/.local/share/virtualenvs/server-9an_1rEM/lib/python3.6/site-packages/celery/app/amqp.py", line 316, in as_task_v2 raise TypeError('task args must be a list or tuple') TypeError: task args must be a list or tuple </code>
最后改为list终于可以了:
<code>>>> deleteTmpAudioFile.apply_async(["98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"], countdown=10) <AsyncResult: 53608319-b87f-4f06-8483-e8f7d1c99632> </code>
【总结】
最后的最后,终于搞清楚了:
<code>>>> deleteTmpAudioFile.apply_async(("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3",), countdown=10) <AsyncResult: bd89951c-2078-49af-b8ea-8c9d8d5b121a> </code>
也是可以的。
而对于之前的提示:
TypeError: task args must be a list or tuple
指的是:apply_async的参数,第一个是args,必须是:tuple或list
所以传递参数,list写成:
<code>["98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"] </code>
是可以的。
而此处,之所以:
<code>("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3") </code>
不行,而:
<code>("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3",) </code>
却是可以的。
去测试了下,才明白:
<code>>>> type(("abc")) <class 'str'> >>> type(("abc",)) <class 'tuple'> </code>
很明显,python中对于:
<code>("abc") </code>
会被识别为字符串
而
<code>("abc", ) </code>
才会被识别为tuple。
所以,此处写成:
list的:
<code>deleteTmpAudioFile.apply_async(["98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3"], countdown=10) </code>
tuple的:
<code>deleteTmpAudioFile.apply_async(("98fc7c46-7aa0-4dd7-aa9d-89fdf516abd6.mp3",), countdown=10) </code>
才可以。
转载请注明:在路上 » 【已解决】celery调用task的apply_async传递参数出错:TypeError takes 1 positional argument but 40 were given