我写了一个包,其中包含一个异步上传内容的函数。目的是用户可以使用我的包,打开文件,并将其上传为异步。问题是,根据用户编写代码的方式,我会收到IO错误。
# EXAMPLE 1
with open("my_file", "rb") as my_file:
package.upload(my_file)
# I/O operation on closed file error
#EXAMPLE 2
my_file = open("my_file", "rb")
package.upload(my_file)
# everything works
据我所知,在第一个示例中,文件立即关闭,因为调用是异步的。我不知道怎么解决这个问题。我无法告诉用户他们无法以示例1的方式打开文件。我可以在package.upload()实现中执行某些操作来阻止文件关闭吗?
答案 0 :(得分:1)
如果您使用with
打开文件,那么当代码块执行在with
内完成时,它将关闭。在您的情况下,只需在open
函数
asynchronus
答案 1 :(得分:1)
您可以使用os.dup
复制文件描述符,并屏蔽异步进程与调用方中的关闭。重复的句柄共享原始文件的其他特征,例如当前文件位置,因此您不会完全屏蔽调用者可以执行的错误操作。
这也会将您的流程限制为具有文件描述符的内容。如果您坚持使用标准文件调用,那么用户可以提交任何类似文件的对象,而不仅仅是磁盘上的文件。
def upload(my_file):
my_file = os.fdopen(os.dup(my_file.fileno()))
# ...queue for async