Installing modules via setuptools in a script

Robert Kern robert.kern at gmail.com
Mon Nov 26 05:34:17 EST 2007


Thorsten Kampe wrote:
> * Robert Kern (Sat, 24 Nov 2007 16:33:37 -0600)
>> Thorsten Kampe wrote:
>>> can anyone give me a short code snippet how to install a missing 
>>> module via setuptools (assuming setuptools is already installed)?!
>>>
>>> Something like this:
>>>
>>> try:
>>>     import missing_module
>>> except import_error
>>>     import setuptools
>>>     setuptools.whatever.install(missing_module)
>> The recommended way to handle dependencies using setuptools is to specify them
>> in the install_requires metadata in the setup() function call in your setup.py:
> 
> It's just a simple script - no package. So I don't even have a 
> setup.py.
> 
>> However, if you have special needs that really do require downloading the
>> dependency at runtime instead of install-time:
>>
>>   #
>> http://peak.telecommunity.com/DevCenter/PkgResources#workingset-methods-and-attributes
>>
>>   import pkg_resources
>>   pkg_resources.resolve('some_package >= 1.0')
>>   pkg_resources.resolve('another_package')
>>
>>   import some_package
>>   import another_package
> 
> [5]>>> pkg_resources.working_set.resolve('betterprint')
> ----------------------------------------------------------------------
> -----
> AttributeError                            Traceback (most recent call 
> last)
> 
> F:\program files\python\<ipython console> in <module>()
> 
> F:\program files\python\lib\site-packages\setuptools-0.6c5-py2.5.egg
> \pkg_resou
> rces.py in resolve(self=<pkg_resources.WorkingSet object at 
> 0x01457710>, requi
> rements=['n', 'i', 'r', 'p', 'r', 'e', 't', 't', 'e', 'b'], env=None, 
> installe
> r=None)
>     472                 # Ignore cyclic or redundant dependencies
>     473                 continue
> --> 474             dist = best.get(req.key)
>         dist = undefined
>         best.get = <built-in method get of dict object at 0x016BC660>
>         req.key = undefined
>     475             if dist is None:
>     476                 # Find the best distribution and add it to the 
> map
> 
> AttributeError: 'str' object has no attribute 'key'

My apologies for misleading you. There is no easy way to do this. Here is a
roundabout way which might be suitable for a throwaway hack script. If it's not
a throwaway hack script, then please heed Ben's advice. Alternatively, just
distribute betterprint along with your script and save yourself the headache.


In [1]: import betterprint
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)

/Users/rkern/<ipython console> in <module>()

ImportError: No module named betterprint

In [2]: import pkg_resources

In [3]: from setuptools.dist import Distribution

In [4]:
pkg_resources.working_set.resolve(pkg_resources.parse_requirements('betterprint'),
installer=Distribution().fetch_build_egg)
zip_safe flag not set; analyzing archive contents...

Installed /Users/rkern/betterprint-0.1-py2.5.egg
Out[4]: [betterprint 0.1 (/Users/rkern/betterprint-0.1-py2.5.egg)]

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco




More information about the Python-list mailing list