Search code examples
pythonpython-2.7setuptools

Parse setup.py without setuptools


I'm using python on my ipad and need a way to grab the name, version, packages etc from a packages setup.py. I do not have access to setuptools or distutils. At first I thought that I'd parse setup.py but that does not seem to be the answer as there are many ways to pass args to setup(). I'd like to create a mock setup() that returns the args passed to it, but I am unsure how to get past the import errors. Any help would be greatly appreciated.


Solution

  • You can dynamically create a setuptools module and capture the values passed to setup indeed:

    >>> import imp
    >>> module = """
    ... def setup(*args, **kwargs):
    ...     print(args, kwargs)
    ... """
    >>>
    >>> setuptools = imp.new_module("setuptools")
    >>> exec module in setuptools.__dict__
    >>> setuptools
    <module 'setuptools' (built-in)>
    >>> setuptools.setup(3)
    ((3,), {})
    

    After the above you have a setuptools module with a setup function in it. You may need to create a few more functions to make all the imports work. After that you can import setup.py and gather the contents. That being said, in general this is a tricky approach as setup.py can contain any Python code with conditional imports and dynamic computations to pass values to setup().