<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Data Unbound &#187; Python</title>
	<atom:link href="http://blog.dataunbound.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dataunbound.com</link>
	<description>Helping organizations access and share data effectively.  Special focus on web APIs for data integration.</description>
	<lastBuildDate>Sat, 12 Feb 2011 21:00:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<image>
  <link>http://blog.dataunbound.com</link>
  <url>http://blog.dataunbound.com/wp-content/plugins/favicon-manager/dataunbound.ico</url>
  <title>Data Unbound</title>
</image>
		<item>
		<title>A mundane task: updating a config file to retain old settings</title>
		<link>http://blog.dataunbound.com/2011/02/12/a-mundane-task-updating-a-config-file-to-retain-old-settings/</link>
		<comments>http://blog.dataunbound.com/2011/02/12/a-mundane-task-updating-a-config-file-to-retain-old-settings/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 21:00:17 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Ecco Pro]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/?p=878</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=A+mundane+task%3A+updating+a+config+file+to+retain+old+settings&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Ecco+Pro&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2011-02-12&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2011/02/12/a-mundane-task-updating-a-config-file-to-retain-old-settings/&amp;rft.language=English"></span>
I want to have a hand in creating an excellent personal information manager (PIM) that can be a worthy successor to Ecco Pro. So far, running EccoExt (a clever and expansive hack of Ecco Pro) has been a eminently practical solution.   You can download the most recent version of this actively developed extension from [...]]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=A+mundane+task%3A+updating+a+config+file+to+retain+old+settings&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Ecco+Pro&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2011-02-12&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2011/02/12/a-mundane-task-updating-a-config-file-to-retain-old-settings/&amp;rft.language=English"></span>
<div>
<div>I want to have a hand in creating an excellent personal information manager (PIM) that can be a worthy successor to <a href="http://en.wikipedia.org/wiki/Ecco_Pro">Ecco Pro</a>. So far, running <a href="http://eccoextdoc.wikispaces.com/Introduction">EccoExt</a> (a clever and expansive hack of Ecco Pro) has been a eminently practical solution.   You can download the most recent version of this actively developed extension from the <a href="http://tech.groups.yahoo.com/group/ecco_pro/files/">files section of the ecco_pro Yahoo! group</a>.   I would do so regularly but one of the painful problems with unpacking (using <a href="http://www.rarlab.com/rar_add.htm">unrar</a>) the new files is that there wasn&#039;t an updater that would retain the configuration options of the existing setup.  So a mundane but happy-making programming task of this afternoon was to write a Python script to do exact that function, making use of the builtin<a href="http://docs.python.org/library/configparser.html"> ConfigParser library</a>.</div>
</div>
<pre>"""
compare eccoext.ini files

My goal is to edit the new file so that any overlapping values take on the current value

"""
current_file_path = "/private/tmp/14868/C/Program Files/ECCO/eccoext.ini"
new_file_path = "/private/tmp/14868/C/utils/eccoext.ini"
updated_file = "/private/tmp/14868/C/utils/updated_eccoext.ini"

# extract the key value pairs in both files to compare  the two

# http://docs.python.org/library/configparser.html
import ConfigParser

def extract_values(fname):
    # generate a parsed configuration object, set of (section, options)
    config = ConfigParser.SafeConfigParser()
    options_set = set()

    config.read(fname)
    sections = config.sections()
    for section in sections:
        options = config.options(section)
        for option in options:
            #value = config.get(section,option)
            options_set.add((section,option))

    return (config, options_set)

# process current file and new file

(current_config, current_options) = extract_values(current_file_path)
(new_config, new_options) = extract_values(new_file_path)

# what are the overlapping options
overlapping_options = current_options &amp; new_options

# figure out which of the overlapping options are the values different

for (section,option) in overlapping_options:
    current_value = current_config.get(section,option)
    new_value = new_config.get(section,option)
    if current_value != new_value:
        print section, option, current_value, new_value
        new_config.set(section,option,current_value)

# write the updated config file

with open(updated_file, 'wb') as configfile:
    new_config.write(configfile)</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2011/02/12/a-mundane-task-updating-a-config-file-to-retain-old-settings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started with flickrapi</title>
		<link>http://blog.dataunbound.com/2009/01/01/getting-started-with-flickrapi/</link>
		<comments>http://blog.dataunbound.com/2009/01/01/getting-started-with-flickrapi/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 21:40:31 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Flickr]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Flickr API]]></category>
		<category><![CDATA[flickrapi]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/?p=248</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Getting+started+with+flickrapi&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Flickr&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2009-01-01&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2009/01/01/getting-started-with-flickrapi/&amp;rft.language=English"></span>
Based on reading the  Python FlickrAPI, I wrote a simple example using the flickrapi library: import flickrapi API_KEY = '[API_KEY]' API_SECRET = '[API_SECRET]' if __name__ == '__main__': # instantiate the flickr object with the API_KEY, SECRET to return ElementTree entities flickr = flickrapi.FlickrAPI(api_key=API_KEY,secret=API_SECRET,format='etree') photos = flickr.photos_search(user_id='73509078@N00', per_page='10') if photos.attrib['stat']: for photo in photos.find('photos').getiterator('photo'): id = [...]]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Getting+started+with+flickrapi&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Flickr&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2009-01-01&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2009/01/01/getting-started-with-flickrapi/&amp;rft.language=English"></span>
<p>Based on reading the  <a href="http://stuvel.eu/flickrapi/documentation/">Python FlickrAPI</a>, I wrote a simple example using the flickrapi library:</p>
<pre>import flickrapi
API_KEY = '[API_KEY]'
API_SECRET = '[API_SECRET]'

if __name__ == '__main__':
    # instantiate the flickr object with the API_KEY, SECRET to return ElementTree entities
    flickr = flickrapi.FlickrAPI(api_key=API_KEY,secret=API_SECRET,format='etree')
    photos = flickr.photos_search(user_id='73509078@N00', per_page='10')

    if photos.attrib['stat']:
        for photo in photos.find('photos').getiterator('photo'):
            id = photo.attrib['id']
            secret = photo.attrib['secret']
            server_id = photo.attrib['server']
            farm_id = photo.attrib['farm']
            user_id = photo.attrib['owner']
            # calculate the thumbnail URL and photo URL
            # http://www.flickr.com/services/api/misc.urls.html
            thumbnail_url = "http://farm%s.static.flickr.com/%s/%s_%s_t.jpg" \
                            % (farm_id, server_id, id, secret)
            photo_url = "http://www.flickr.com/photos/%s/%s"  % (user_id, id)
            print thumbnail_url, photo_url</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2009/01/01/getting-started-with-flickrapi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django hosting options?</title>
		<link>http://blog.dataunbound.com/2008/12/31/django-hosting-options/</link>
		<comments>http://blog.dataunbound.com/2008/12/31/django-hosting-options/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 20:01:47 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[web hosting]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/2008/12/31/django-hosting-options/</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Django+hosting+options%3F&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.subject=web+hosting&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/django-hosting-options/&amp;rft.language=English"></span>
Although it seems that you can host Django on dreamhost (Django &#8211; DreamHost and JeffCroft.com: Setting up Django on Dreamhost), I might be looking for another host for Django, such as (mt) Media Temple, which is what is used by Django creator Adrian Holovaty for his EveryBlock project.]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Django+hosting+options%3F&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.subject=web+hosting&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/django-hosting-options/&amp;rft.language=English"></span>
<p>Although it seems that you can host <a href="http://www.djangoproject.com/">Django</a> on dreamhost (<a href="http://wiki.dreamhost.com/index.php/Django">Django &#8211; DreamHost</a> and <a href="http://jeffcroft.com/blog/2006/may/11/django-dreamhost/">JeffCroft.com: Setting up Django on Dreamhost</a>), I might be looking for another host for Django, such as <a href="http://weblog.mediatemple.net/weblog/2008/09/04/django-gridcontainers-officially-launched/">(mt) Media Temple</a>, which is what is used by Django creator Adrian Holovaty for his <a href="http://www.everyblock.com/about/faq/#technology">EveryBlock</a> project.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2008/12/31/django-hosting-options/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SWIG</title>
		<link>http://blog.dataunbound.com/2008/12/31/swig/</link>
		<comments>http://blog.dataunbound.com/2008/12/31/swig/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 19:58:03 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[SWIG]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/?p=217</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=SWIG&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/swig/&amp;rft.language=English"></span>
Although I plan to be programming primarily  in Python (and JavaScript)  this next year, I don&#039;t want to forget about C/C++.  I hope to have an opportunity to use SWIG at some point to connect high-speed code in C/C++ with Python code: SWIG is an interface compiler that connects programs written in C and C++ [...]]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=SWIG&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/swig/&amp;rft.language=English"></span>
<p>Although I plan to be programming primarily  in Python (and JavaScript)  this next year, I don&#039;t want to forget about C/C++.  I hope to have an opportunity to use<a href="http://www.swig.org/exec.html"> SWIG</a> at some point to connect high-speed code in C/C++ with Python code:</p>
<blockquote><p>SWIG is an interface compiler that connects programs written in C and C++ with scripting languages such as Perl, Python, Ruby, and Tcl. It works by taking the declarations found in C/C++ header files and using them to generate the wrapper code that scripting languages need to access the underlying C/C++ code. In addition, SWIG provides a variety of customization features that let you tailor the wrapping process to suit your application.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2008/12/31/swig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time to study Python 3.0?</title>
		<link>http://blog.dataunbound.com/2008/12/31/time-to-study-python-30/</link>
		<comments>http://blog.dataunbound.com/2008/12/31/time-to-study-python-30/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 19:53:43 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Python 3.0]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/?p=214</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Time+to+study+Python+3.0%3F&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/time-to-study-python-30/&amp;rft.language=English"></span>
I had been vaguely following Python 3 when Python 3.0 final was released on December 3, 2008. I decide to start coming to terms with what this new and intentionally non-backwards compatible version of Python means by printing out What’s New In Python 3.0 — Python v3.0 documentation and Linux.com :: Python 3.0 makes a [...]]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=Time+to+study+Python+3.0%3F&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-31&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/31/time-to-study-python-30/&amp;rft.language=English"></span>
<p>I had been vaguely following Python 3 when <a href="http://python.org/download/releases/3.0/">Python 3.0 final</a> was released on December 3, 2008.  I decide to start coming to terms with what this new and intentionally non-backwards compatible version of Python means by printing out <a href="http://docs.python.org/3.0/whatsnew/3.0.html">What’s New In Python 3.0 — Python v3.0 documentation</a> and <a href="http://www.linux.com/feature/150399?theme=print">Linux.com :: Python 3.0 makes a big break</a>.  My current conclusion from reading the articles:  I should learn Python 3.0 in the background but make mastery of Python 2.x the priority for at least the next several years.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2008/12/31/time-to-study-python-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>listing applications installed in Windows XP with Python</title>
		<link>http://blog.dataunbound.com/2008/12/30/listing-installed-apps-in-win32-with-python/</link>
		<comments>http://blog.dataunbound.com/2008/12/30/listing-installed-apps-in-win32-with-python/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 15:26:39 +0000</pubDate>
		<dc:creator>Raymond Yee</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[pywin32]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[WMI]]></category>

		<guid isPermaLink="false">http://blog.dataunbound.com/?p=189</guid>
		<description><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=listing+applications+installed+in+Windows+XP+with+Python&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-30&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/30/listing-installed-apps-in-win32-with-python/&amp;rft.language=English"></span>
The end of 2008 is approaching, making it an appropriate time to take inventory of my life &#8212; which also includes a lot of  my computer-related stuff.   In addition to cleaning up my office, I&#039;m also cleaning up my Lenovo Thinkpad T60p, my primary work computer, whose drive has been close to its 100 GB [...]]]></description>
			<content:encoded><![CDATA[	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=listing+applications+installed+in+Windows+XP+with+Python&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Python&amp;rft.source=Data+Unbound&amp;rft.date=2008-12-30&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=http://blog.dataunbound.com/2008/12/30/listing-installed-apps-in-win32-with-python/&amp;rft.language=English"></span>
<p>The end of 2008 is approaching, making it an appropriate time to take inventory of my life &#8212; which also includes a lot of  my computer-related stuff.   In addition to cleaning up my office, I&#039;m also cleaning up my <a href="http://www-307.ibm.com/pc/support/site.wss/product.do?template=/product.do?template=%2Fproductpage%2Flandingpages%2FproductPageLandingPage.vm&amp;sitestyle=lenovo&amp;brandind=10&amp;familyind=293924&amp;machineind=296453&amp;modelind=349325&amp;partnumberind=0&amp;subcategoryind=0&amp;doctypeind=8&amp;doccategoryind=0&amp;operatingsystemind=53385&amp;validate=true">Lenovo Thinkpad T60p</a>, my primary work computer, whose drive has been close to its 100 GB limit for some time now.  To help me spot the disk hogs, I&#039;ve been running <a href="http://windirstat.info/">WinDirStat &#8211; Windows Directory Statistics</a>.</p>
<p>I&#039;m also looking through all the programs I&#039;ve installed over the years, lot of which I&#039;ve not used and should be uninstalled to save space!  Although I&#039;ve been using <a href="http://support.microsoft.com/kb/307895">Windows XP&#039;s Control Panel&#039;s Add/Remove Program</a>,  I would also like to have some automated way to inventory my system &#8212; hence I started looking for Python code to do so.</p>
<p>I found the following code in <a href="http://mail.python.org/pipermail/python-list/2005-June/328261.html">List of all installed applications (XP)?</a>:</p>
<pre>import win32api, win32con, pywintypes

appKey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, \
           'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths', 0, win32con.KEY_READ)
sklist = win32api.RegEnumKeyEx(appKey)

for skey in sklist:
     print skey[0]

     try:
          wPath = win32api.RegQueryValue(appKey, skey[0])
          print '    ' + wPath
     except pywintypes.error,details:
          print '### Error [pywintypes.error]: ' + details[2]

win32api.RegCloseKey(appKey)</pre>
<p>The code seems to work.  The <a href="http://mail.python.org/pipermail/python-list/2005-June/328301.html">response to query for a better technique</a> pointed to <a href="http://tgolden.sc.sabren.com/python/wmi.html">Tim Golden&#039;s Python Stuff: wmi</a>.  WMI looks cool and worthwhile following up with, especially because of what seems to be excellent documentation in the form of <a href="http://tgolden.sc.sabren.com/python/wmi-tutorial.html">wmi Tutorial</a> and <a href="http://tgolden.sc.sabren.com/python/wmi_cookbook.html">wmi Cookbook</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dataunbound.com/2008/12/30/listing-installed-apps-in-win32-with-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

