Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件实例作为参数传递给芹菜任务会引发;ValueError:对关闭的文件执行I/O操作;_Python_Django_Celery - Fatal编程技术网

Python 将文件实例作为参数传递给芹菜任务会引发;ValueError:对关闭的文件执行I/O操作;

Python 将文件实例作为参数传递给芹菜任务会引发;ValueError:对关闭的文件执行I/O操作;,python,django,celery,Python,Django,Celery,我需要将文件作为参数传递给芹菜任务,但传递的文件不知何故被关闭了。它发生在我以异步方式执行任务的情况下。 这是预期的行为吗 观点: from engine.tasks import s3_upload_handler def myfunc(): f = open('/app/uploads/pic.jpg', 'rb') s3_file_handler.apply_async(kwargs={"uploaded_file" : f,"file_name" : "test.jpg"

我需要将文件作为参数传递给芹菜任务,但传递的文件不知何故被关闭了。它发生在我以异步方式执行任务的情况下。 这是预期的行为吗

观点:

from engine.tasks import s3_upload_handler
def myfunc():
    f = open('/app/uploads/pic.jpg', 'rb')
    s3_file_handler.apply_async(kwargs={"uploaded_file" : f,"file_name" : "test.jpg"})
任务:

def s3_upload_handler(uploaded_file,file_name):
    ...
    #some code for uploading to s3
回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 437, in __protected_call__
    return self.run(*args, **kwargs)
  File "/app/photohosting/engine/tasks.py", line 34, in s3_upload_handler
    key.set_contents_from_file(uploaded_file)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1217, in set_contents_from_file
    spos = fp.tell()
ValueError: I/O operation on closed file
花卉原木:

kwargs  {
         'file_name': 'test.jpg', 
         'uploaded_file': <closed file '<uninitialized file>', 
          mode '<uninitialized file>' at 0x7f6ab9e75e40>
         }
kwargs{
“文件名”:“test.jpg”,
“上传的文件”:
}

是的,当然,文件会被关闭。异步芹菜任务在一个完全独立的进程中运行(此外,它们甚至可以在不同的机器上运行),并且无法将打开的文件传递给它


您应该在调用任务的过程中关闭该文件,然后将其名称和可能在文件中的位置(如果需要)传递给任务,然后在任务中重新打开该文件。

另一种方法是打开该文件并获得一个二进制blob,然后通过线路传输。当然,如果文件确实很大,@Vasily说的更好,但如果工作人员在不同的m/c上运行(除非您的文件在共享存储上)。

这意味着无法将内存中的文件实例传递给异步任务,我应该在之前保存它。@ValentinKantor如果“保存”是指“关闭”,那么是的,你必须关闭这个文件instance@Spc_555他问如果他想在芹菜任务中使用内存文件,是否必须将其写入磁盘。答案是肯定的,在将其文件名传递给芹菜任务之前,必须将其保存到磁盘。关闭内存中的文件会清除它,所以他不应该这样做。嗨,你能解释一下如何从文件中获取二进制blob吗?