What you can use is a library named: Rtree
which is independent of a spatially enabled database.
From the tutorial:
# Import the library and create an index:
from rtree import index
idx = index.Index()
# Insert your fixed polygons to the index by the envelope (bounding box)
# coordinates of those polygons:
for index, polygon in enumerate(my_polygon_list):
idx.insert(index, polygon.envelope)
# To query with a point you can do the following (explanation after the example):
potential_polys = list(idx.intersection((point.x, point.y, point.x, point.y)))
Break it up: