<br><br><div class="gmail_quote">2011/1/6 Jason Roberts <span dir="ltr">&lt;<a href="mailto:jason.roberts@duke.edu">jason.roberts@duke.edu</a>&gt;</span><br><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);">So #3 is not better by virtue of not having to modify the bindings; it does have to modify the bindings. But #3 is appealing because setting the PATH from Python code sometimes has weird issues. For example, when I tried it in my code, it produced a weird problem when I tried to use the “nose” Python testing framework to run test cases that involved calling Python modules from GDAL and ArcGIS. The problem there may ultimately be a Microsoft issue in which the environment settings for a process are maintained by the Microsoft C runtime library (msvcrt*.dll) and Python, ArcGIS, and GDAL may use different versions of that library. I do not want to digress into this here, but suffice to say, I prefer #3 to #2 because it did not have this problem.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p></div></div></blockquote><div><br>This is quite a common issue the getenv/_putenv CRT functions operate only on the data structures accessible to the run-time library (CRT) and not on the environment &quot;segment&quot; created for the process by the operating system. In this regard the libraries work only on a snapshot of the variables that have been set during the CRT startup. In this case we should probably find a function that invokes the <a href="http://msdn.microsoft.com/en-us/library/ms686206%28v=vs.85%29.aspx">SetEnvironmentVariable</a> API instead.<br>
<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p>
<p><span style="font-size: 10pt; color: rgb(31, 73, 125);"><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">    </span></span></span><span style="font-size: 10pt; color: rgb(31, 73, 125);">Modify the makefiles for your SDK so that it runs release-XXXX-dev\gdal\swig\python\setup.py with the “bdist --formats=wininst” option. This will produce an installation program such as gdal-1.7.3.win32-py2.5.exe. This is what the user will run to install the Python bindings together with a private copy of the GDAL DLLs used just by those bindings. On Python 2.6 and later, we probably want “bdist --formats=msi” to produce a .msi file rather than a .exe, because Windows likes .msi files much better than .exes for security purposes. IIRC, Python 2.5 and earlier do not have the msi option.</span></p>
<p><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p></div></div></blockquote><div>This can be done fairly easily. Does this mean we would require each build for multiple python versions?<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div link="blue" vlink="purple" lang="EN-US"><div><p><span style="font-size: 10pt; color: rgb(31, 73, 125);"><span>2.<span style="font: 7pt &quot;Times New Roman&quot;;">    </span></span></span><span style="font-size: 10pt; color: rgb(31, 73, 125);">Modify release-XXXX-dev\gdal\swig\python\setup.py to include the GDAL DLLs and data files in the data_files list that is passed to the setup() function. Make sure it is only done for Windows (Python code can check that). The goal is to have the installation program create the following kind of installation:</span></p>
<p><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p></div></div></blockquote><div>Hmmm. I&#39;m keen to avoid any local modifications in the compiled files throughout the build system. Do we have some option to load this infromation from an external file (which is probably loaded by setup.py if exists)? Or I must write a custom setup2.py containing this customization.<br>
<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><p><span style="font-size: 10pt; color: rgb(31, 73, 125);"><span>3.<span style="font: 7pt &quot;Times New Roman&quot;;">    </span></span></span><span style="font-size: 10pt; color: rgb(31, 73, 125);">Introduce a new file release-XXXX-dev\gdal\swig\python\extensions\_gdal_dll_loader.cpp. This file will call GetDllDirectory to find the current DLL directory setting, call SetDllDirectory to C:\PythonXX\Lib\site-packages\osgeo\bin (or wherever the Python instance is installed), call LoadLibrary(&quot;gdal17.dll&quot;), and call SetDllDirectory back to what it was before. There are more details to consider. For example, we might want to have it call LoadLibrary first to see if it can load the GDAL DLL from the PATH, allowing the user to use their own GDAL DLLs without having to overwrite the ones in the Python directory. Or we might <u>not</u> want to do that, with the idea that the GDAL Python bindings must be tightly coupled to a particular version of GDAL’s DLLs.</span></p>
<p><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p></div></div></blockquote><div>That seems to be quite complicated, not sure it that&#39;s working for those libraries using LoadLibrary binding at run time. Wouldn&#39;t that be better getting back to add the location to the PATH of the process in a loader.py (using SetEnvironmentVariable).<br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div link="blue" vlink="purple" lang="EN-US"><div><br><p><span style="font-size: 10pt; color: rgb(31, 73, 125);"><span>5.<span style="font: 7pt &quot;Times New Roman&quot;;">    </span></span></span><span style="font-size: 10pt; color: rgb(31, 73, 125);">Modify gdal.py, osr.py, and so on to do something like this:</span></p>
<p><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p><p class="MsoNormal" style="margin-left: 1in;"><span style="font-size: 10pt; color: rgb(31, 73, 125);">import sys</span></p><p class="MsoNormal" style="margin-left: 1in;">
<span style="font-size: 10pt; color: rgb(31, 73, 125);">if sys.platform == &#39;win32&#39;:     # TODO: add check for Windows x64 as well</span></p><p class="MsoNormal" style="margin-left: 1in;"><span style="font-size: 10pt; color: rgb(31, 73, 125);">    try:</span></p>
<p class="MsoNormal" style="margin-left: 1in;"><span style="font-size: 10pt; color: rgb(31, 73, 125);">        import osgeo._gdal_dll_loader          # As part of this, Python will call an “init” function inside. That function will do the SetDllDirectory, etc.</span></p>
<p class="MsoNormal" style="margin-left: 1in;"><span style="font-size: 10pt; color: rgb(31, 73, 125);">    except:</span></p><p class="MsoNormal" style="margin-left: 1in;"><span style="font-size: 10pt; color: rgb(31, 73, 125);">        pass</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"></span></p></div></div></blockquote><div><br>Such changes can be done in the SWIG interface files easily.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div link="blue" vlink="purple" lang="EN-US"><div><p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p><p><span style="font-size: 10pt; color: rgb(31, 73, 125);"><span>6.<span style="font: 7pt &quot;Times New Roman&quot;;">    </span></span></span><span style="font-size: 10pt; color: rgb(31, 73, 125);">Do whatever is necessary to ensure the GDAL_DATA etc are properly set up inside GDAL. I can’t remember if this will “just work” using directories named gdal-data, gdal-plugins, or if it is necessary for the _gdal_dll_loader.pyd to call some GDAL functions to make it happen.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: rgb(31, 73, 125);"> </span></p></div></div></blockquote><div><br>I guess this could also be set form a python script (probably from loader.py)<br><br><br></div></div>
Best regards,<br><br>Tamas<br><br><div style="visibility: hidden; left: -5000px; position: absolute; z-index: 9999; padding: 0px; margin-left: 0px; margin-top: 0px; overflow: hidden; word-wrap: break-word; color: black; font-size: 10px; text-align: left; line-height: 130%;" id="avg_ls_inline_popup">
</div>