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