I'm not completely sure if you actually want a Py_buffer object or are
looking for any convenient way to access a buffer as raw data. Assuming
the latter, you could go via a regular Python memoryview:
obj_view = memoryview(obj)
obj_view_as_bytes = obj_view.cast('b') # or 'B' if you want it unsigned
cdef signed char[::1] cy_view = obj_view_as_bytes
The cost is essentially one Python function call (memoryview.cast) and
then after that you have it in a Cython char memoryview.