Sean Gillies (Posts about with)
https://sgillies.net/tags/with.atom
2023-12-31T01:26:20Z
Sean Gillies
Nikola
Rethinking driver management in fiona and rasterio
https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html
2014-01-22T00:00:00-07:00
2014-01-22T00:00:00-07:00
Sean Gillies
<p>In a C program using the GDAL (or OGR) API, you manage the global format
driver registry like gdalinfo does:</p>
<div class="code"><pre class="code c"><a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-1" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-1" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-1"></a><span class="cp">#include</span><span class="w"> </span><span class="cpf">"gdal.h"</span><span class="cp"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-2" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-2" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-2"></a>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-3" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-3" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-3"></a><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="w"> </span><span class="n">argv</span><span class="w"> </span><span class="p">)</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-4" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-4" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-4"></a><span class="p">{</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-5" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-5" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-5"></a>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-6" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-6" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-6"></a><span class="w"> </span><span class="cm">/* Register all drivers. */</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-7" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-7" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-7"></a><span class="w"> </span><span class="n">GDALAllRegister</span><span class="p">();</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-8" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-8" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-8"></a>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-9" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-9" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-9"></a><span class="w"> </span><span class="p">...</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-10" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-10" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-10"></a>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-11" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-11" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-11"></a><span class="w"> </span><span class="cm">/* De-register all drivers. */</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-12" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-12" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-12"></a><span class="w"> </span><span class="n">GDALDestroyDriverManager</span><span class="p">();</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-13" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-13" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-13"></a>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-14" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-14" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-14"></a><span class="w"> </span><span class="n">exit</span><span class="p">(</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">);</span><span class="w"></span>
<a id="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-15" name="rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-15" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_b2f114a1a6ff426287c1dc6f9a7c8c9f-15"></a><span class="p">}</span><span class="w"></span>
</pre></div>
<p>I used to try to hide this in Python bindings by calling
GDALAllRegister() in a module and registering a function that called
GDALDestroyDriverManager() with the atexit module.</p>
<div class="code"><pre class="code python"><a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-1" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-1" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-1"></a><span class="sd">""" gdal.py """</span>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-2" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-2" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-2"></a>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-3" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-3" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-3"></a><span class="kn">import</span> <span class="nn">atexit</span>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-4" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-4" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-4"></a>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-5" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-5" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-5"></a><span class="k">def</span> <span class="nf">cleanup</span><span class="p">():</span>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-6" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-6" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-6"></a> <span class="n">GDALDestroyDriverManager</span><span class="p">()</span>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-7" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-7" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-7"></a>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-8" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-8" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-8"></a><span class="n">atexit</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">cleanup</span><span class="p">)</span>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-9" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-9" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-9"></a>
<a id="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-10" name="rest_code_f7f3a3f6773144f7bda7bfad8990dac0-10" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_f7f3a3f6773144f7bda7bfad8990dac0-10"></a><span class="n">GDALAllRegister</span><span class="p">()</span>
</pre></div>
<p>Importing that gdal module registers all drivers and the drivers are
de-registered when the module is torn down. I don't like this approach
anymore. I prefer that driver registration to not be a side effect of module
import. And in testing, I'm finding that it's a drag to write the code
needed to keep the cleanup function around until the atexit handlers
execute.</p>
<p>Instead of going back to the C style, I'm going to go forward with
context managers and a <code class="docutils literal">with</code> statement to manage the GDAL and OGR
global driver registries. The <code class="docutils literal">with rasterio.drivers()</code> expression creates
a GDAL driver environment.</p>
<div class="code"><pre class="code python"><a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-1" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-1" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-1"></a><span class="kn">import</span> <span class="nn">rasterio</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-2" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-2" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-2"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-3" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-3" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-3"></a><span class="k">try</span><span class="p">:</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-4" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-4" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-4"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-5" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-5" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-5"></a> <span class="c1"># Use a with statement and context manager to register all the</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-6" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-6" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-6"></a> <span class="c1"># GDAL/OGR drivers.</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-7" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-7" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-7"></a> <span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">drivers</span><span class="p">():</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-8" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-8" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-8"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-9" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-9" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-9"></a> <span class="c1"># Count the manager's registered drivers (156 in this case).</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-10" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-10" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-10"></a> <span class="nb">print</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">driver_count</span><span class="p">()</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-11" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-11" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-11"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-12" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-12" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-12"></a> <span class="c1"># Open a file and get to work.</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-13" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-13" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-13"></a> <span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'rasterio/tests/data/RGB.byte.tif'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-14" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-14" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-14"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-15" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-15" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-15"></a> <span class="c1"># Oops, an exception.</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-16" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-16" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-16"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Oops"</span><span class="p">)</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-17" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-17" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-17"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-18" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-18" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-18"></a> <span class="c1"># When this block ends, even via an exception, the drivers are</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-19" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-19" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-19"></a> <span class="c1"># de-registered.</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-20" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-20" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-20"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-21" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-21" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-21"></a><span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-22" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-22" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-22"></a> <span class="nb">print</span> <span class="s2">"Caught exception: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-23" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-23" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-23"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-24" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-24" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-24"></a><span class="c1"># Drivers were de-registered and this will print 0.</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-25" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-25" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-25"></a><span class="nb">print</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">driver_count</span><span class="p">()</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-26" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-26" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-26"></a>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-27" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-27" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-27"></a><span class="c1"># Output:</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-28" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-28" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-28"></a><span class="c1"># 156</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-29" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-29" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-29"></a><span class="c1"># Caught exception: Oops</span>
<a id="rest_code_708e7e5ab6d247f7b0913c390d869b9a-30" name="rest_code_708e7e5ab6d247f7b0913c390d869b9a-30" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_708e7e5ab6d247f7b0913c390d869b9a-30"></a><span class="c1"># 0</span>
</pre></div>
<p>The nice thing about this approach is that the registered drivers get
de-registered and the memory deallocated no matter what happens in the
<code class="docutils literal">with</code> block. And it's less code than my old approach using atexit.</p>
<p>So that programs written for older versions of Fiona and rasterio don't break, I'm
also letting opened collections and datasets manage the driver registry if no other
manager is already present. So this code below works as before.</p>
<div class="code"><pre class="code python"><a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-1" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-1" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-1"></a><span class="kn">import</span> <span class="nn">rasterio</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-2" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-2" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-2"></a>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-3" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-3" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-3"></a><span class="k">try</span><span class="p">:</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-4" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-4" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-4"></a>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-5" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-5" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-5"></a> <span class="k">with</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'rasterio/tests/data/RGB.byte.tif'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-6" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-6" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-6"></a> <span class="nb">print</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">driver_count</span><span class="p">()</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-7" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-7" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-7"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Oops"</span><span class="p">)</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-8" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-8" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-8"></a>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-9" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-9" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-9"></a><span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-10" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-10" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-10"></a> <span class="nb">print</span> <span class="s2">"Caught exception: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">e</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-11" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-11" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-11"></a>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-12" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-12" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-12"></a><span class="nb">print</span> <span class="n">rasterio</span><span class="o">.</span><span class="n">driver_count</span><span class="p">()</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-13" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-13" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-13"></a>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-14" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-14" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-14"></a><span class="c1"># Output:</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-15" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-15" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-15"></a><span class="c1"># 156</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-16" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-16" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-16"></a><span class="c1"># Caught exception: Oops</span>
<a id="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-17" name="rest_code_9be9c65f3bc444a09df40ac9e040e0fe-17" href="https://sgillies.net/2014/01/22/rethinking-driver-management-in-fiona-and-rasterio.html#rest_code_9be9c65f3bc444a09df40ac9e040e0fe-17"></a><span class="c1"># 0</span>
</pre></div>
<p>It's more efficient to register drivers once and only once in your program, so
use <code class="docutils literal">with fiona.drivers()</code> or <code class="docutils literal">with rasterio.drivers()</code> in new programs using
<a class="reference external" href="https://pypi.python.org/pypi/Fiona">Fiona 1.1</a> and
<a class="reference external" href="https://pypi.python.org/pypi/rasterio/0.5">rasterio 0.5</a> or newer.</p>