如何将 tqdm.wrapattr 上传的进度传递给函数或变量?
Posted
技术标签:
【中文标题】如何将 tqdm.wrapattr 上传的进度传递给函数或变量?【英文标题】:How can I pass to a function or variable the progress of a tqdm.wrapattr upload? 【发布时间】:2021-12-12 20:00:34 【问题描述】:背景
我有一个程序,客户端可以在其中查看服务器上的文件列表,然后选择要从服务器上传到 Google Cloud Storage 的文件。当文件从服务器上传到谷歌云存储时,我想让客户端知道文件上传的进度。 到目前为止,我可以使用 tqdm 的 wrapattr 方法在服务器的终端屏幕上显示上传的进度,如下所示:
object_address = str(uuid.uuid4())
upload_url, upload_method = get_upload_url(object_address) # fetches signed upload URL
size = os.path.getsize(filename)
with open(filename, "rb") as in_file:
total_bytes = os.fstat(in_file.fileno()).st_size
with tqdm.wrapattr(
in_file,
"read",
total=total_bytes,
miniters=1,
desc="Uploading to my bucket",
) as file_obj:
response = requests.request(
method=upload_method,
url=upload_url,
data=file_obj,
headers="Content-Type": "application/octet-stream",
)
response.raise_for_status()
return object_address, size
问题
我需要将上传进度发送给客户端。如果您只能在服务器的终端屏幕上看到上传进度,那将无济于事。
问题
如何检索上传进度以便将其发送给客户端?
不幸的是,我认为 wrapattr 函数没有任何回调函数的参数,我可以在每次将块上传到 Google Cloud Storage 时调用这些参数。我愿意接受其他无需使用 tqdm wrapattr 方法即可检索进度的方法。
我知道 Google Cloud Storage 具有可恢复的上传功能,可让您跟踪进度,但它们使用 cURL,因此我必须使用子进程,而且我宁愿使用比这更干净的东西。
谢谢!
【问题讨论】:
我可以看到您只共享应用程序中的代码,但是客户端如何与应用程序本身进行交互?您能否添加更多有关用户如何获取您尝试显示的信息的信息?我想你也打算使用终端,但我认为你应该分享更多关于这方面的信息。 @Ginger - 感谢您的反馈。我更新了背景以提供更多细节。客户端将看到服务器上的文件列表。然后客户端会选择服务器上的一个文件从服务器上传到谷歌云存储,服务器会这样做。同样,问题是在文件上传时将上传进度返回给客户端。谢谢! 【参考方案1】:正如我所见,您已经能够获得进度并成功显示它,但不能在客户端。在这个question 中,他们使用requests 库来获取进度,试图模拟类似于urllib2 POST progress monitoring 的文件适配器:
class IterableToFileAdapter(object):
def __init__(self, iterable):
self.iterator = iter(iterable)
self.length = len(iterable)
def read(self, size=-1): # TBD: add buffer for `len(data) > size` case
return next(self.iterator, b'')
def __len__(self):
return self.length
您可以使用 tqdm 将此方法应用于您自己的应用程序。
【讨论】:
以上是关于如何将 tqdm.wrapattr 上传的进度传递给函数或变量?的主要内容,如果未能解决你的问题,请参考以下文章