curl.perform() pycurl.error: (23, ‘Failed writing body (0 != 59)’)

The introduction of the pycurl and StringIO modules when using python3.7 is prone to the above errors
The solution for importing the StringIO module:
StringIO module can only be imported in python2, directly from StringIO import StringIO
But python3, STringIO, and cStringIO modules are gone, and to use them you have to import the IO modules:

from io import StringIO
dot_data = StringIO()

StringIO can also be used by importing the Six module:

from six import StringIO

or

from sklearn.externals.six import StringIO 

Provide a method that is both Python2 and Python3 compatible:

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

This solves the problem of importing the StringIO module in different Python versions.
But Pycurl is also influenced by the Python version when it encodes strings, as follows:
Write instead
Under python 2, you can use StringIO object:

import pycurl
from StringIO import StringIO
c = pycurl.Curl()
c.setopt(c.URL,'http://pycurl.io')
buffer = StringIO()
c.setopt(c.WRITEDATA, buffer)
# Same result if using WRITEFUNCTION instead:
#c.setopt(c.WRITEFUNCTION, buffer.write)
c.perform()
# ok

Under python 3, when pycurl USES the bytes parameter, the response must be written to the BytesIO object:

import pycurl
from io import BytesIO
c = pycurl.Curl()
c.setopt(c.URL,'http://pycurl.io')
buffer = BytesIO()
c.setopt(c.WRITEDATA, buffer)
# Same result if using WRITEFUNCTION instead:
#c.setopt(c.WRITEFUNCTION, buffer.write)
c.perform()
# ok

Trying to use the StringIO object will produce an error: :

import pycurl
from io import StringIO
c = pycurl.Curl()
c.setopt(c.URL,'http://pycurl.io')
buffer = StringIO()
c.setopt(c.WRITEDATA, buffer)
c.perform()

The error message is as follows:

The following idiom is available for code that requires compatibility with Python2 and Python3:

import pycurl
try:
    # Python 3
    from io import BytesIO
except ImportError:
    # Python 2
    from StringIO import StringIO as BytesIO
c = pycurl.Curl()
c.setopt(c.URL,'http://pycurl.io')
buffer = BytesIO()
c.setopt(c.WRITEDATA, buffer)
c.perform()
# ok
# Decode the response body:
string_body = buffer.getvalue().decode('utf-8')

 

Read More: