【问题标题】:Pycurl WRITEDATA WRITEFUNCTION collision/crashPycurl WRITEDATA WRITEFUNCTION 碰撞/崩溃
【发布时间】:2023-04-03 12:15:01
【问题描述】:

如何关闭 WRITEFUNCTION 和 WRITEDATA?

使用 pycurl,我有一个名为 curlUtil 的类。在其中我有 pageAsString (self, URL) ,它返回一个字符串。

为此,我设置了 WRITEFUNCTION。现在在 downloadFile (self, URL, fn, overwrite=0) 我做了一个 open 和 self.c.Setopt (pycurl.WRITEFUNCTION, 0) 这会导致问题。 Int 不是有效的参数。

然后我假设 WRITEDATA 会覆盖该值,否则会有一个 NOWRITEFUNCTION 推荐。 NOWRITEFUNCTION 不存在,所以我只使用了 WRITEDATA 并且 Python 崩溃了。

我编写了一个名为 reboot() 的快速函数,它关闭 curl,再次打开它,然后调用 reset 将其置于默认状态。我在 pageAsString 和 downloadFile 中都调用它,完全没有问题。但是,我不想重新初始化 curl。我可能设置了一些特殊选项。

如何关闭 WRITEFUNCTION 和 WRITEDATA?

【问题讨论】:

    标签: python crash libcurl pycurl


    【解决方案1】:

    使用 write 函数,而不是关闭它会为你省去很多麻烦。您可能想通过使用 WRITEFUNCTION 重写您的 pageAsString..

    举个例子:

    from cStringIO import StringIO
    c = pycurl.Curl()
    buffer = StringIO()
    c.setopt(pycurl.WRITEFUNCTION, buffer.write)
    c.setopt(pycurl.URL, "http://example.com")
    c.perform()
    ...
    buffer.getvalue() # will return the data fetched.
    

    【讨论】:

    • 我的 pageAsString 以类似的方式工作。问题是当我在 do setpot(pycurl.WRITEDATA, file) 中打开文件时。但是我可以更改它以便它使用 writedata 但我想知道如何关闭它以防万一需要关闭另一个选项。
    • 将 writefunction 设置为 0 将关闭它。在这种情况下,您将不得不处理 libcurl 将应用的其他事情。都在这里详述:curl.haxx.se/libcurl/c/curl_easy_setopt.html
    • 我在我的 C 版本中执行此操作。在pycurl中我得到一个错误:(。它不允许int作为参数。但它很好我可以通过使用writefunction而不是writedata来解决这个问题