Pytest's session fixture scope is really handy, but there are some things which need to execute only once per actual test session. For example, one of my session fixtures sets up DB tables at the start of the test session and tears them down at the end. (I use PostgreSQL's nested transactions to keep from having to drop and recreate tables between each individual test.)
@pytest.fixture(scope='session')
def dbtables(request, sqlengine):
Base.metadata.create_all(sqlengine)
def teardown():
Base.metadata.drop_all(sqlengine)