To use ZPT macros in Pyramid, you need to make the macro template itself available to the rendered template by passing the macro template, or even the macro itself, into the rendered template(excerpt from docs).
from pyramid.renderers import get_renderer
from pyramid.view import view_config
@view_config(renderer='templates/progress.pt')
def my_view(request):
snippets = get_renderer('templates/macros.pt').implementation()
main = get_renderer('templates/main_template.pt').implementation()
return {'main':main,'snippets':snippets}
In the template that will be used by the renderer, you should reference the macros like this. I assume that your macro in main_template.pt containing the slot 'content' is named 'global_layout'. Change it to your name.
<html metal:use-macro="main.macros['global_layout']">
<div metal:fill-slot="content">
...
<div metal:use-macro="snippets.macros['step-0']"></div>
...
</div>
</html>
A reference to a macro inside a template goes like this:
<div metal:use-macro="template.macros['step-0']">
<div metal:fill-slot="content">
added your content
</div>
</div>
<div metal:define-macro="step-0">
a placeholder for your content
<div metal:define-slot="content">
</div>
</div>
To get all the macros inside a template for passing them inside a view into a rendered template add this line to first code sample and extend the returned dictionary.
macros = get_renderer('templates/main_template.pt').implementation().macros
I could explain more, but look at the docs. A simple case like the one above is described here.
A full tutorial presents this topic as well. The second link will boost your knowledge.
Afterwards the pyramid docs will provide even more details. Welcome to pyramid.