def parse_version(package):
    """
    Statically parse the version number from __init__.py

    CommandLine:
        python -c "import setup; print(setup.parse_version('ubelt'))"
    """
    from os.path import dirname, join, exists
    import ast

    # Check if the package is a single-file or multi-file package
    _candiates = [
        join(dirname(__file__), package + '.py'),
        join(dirname(__file__), package, '__init__.py'),
    ]
    _found = [init_fpath for init_fpath in _candiates if exists(init_fpath)]
    if len(_found) > 0:
        init_fpath = _found[0]
    elif len(_found) > 1:
        raise Exception('parse_version found multiple init files')
    elif len(_found) == 0:
        raise Exception('Cannot find package init file')

    with open(init_fpath, 'r') as file_:
        sourcecode = file_.read()
    pt = ast.parse(sourcecode)
    class VersionVisitor(ast.NodeVisitor):
        def visit_Assign(self, node):
            for target in node.targets:
                if getattr(target, 'id', None) == '__version__':
                    self.version = node.value.s
    visitor = VersionVisitor()
    visitor.visit(pt)
    return visitor.version
def parse_version(package):
    """
    Statically parse the version number from __init__.py

    CommandLine:
        python -c "import setup; print(setup.parse_version('ubelt'))"
    """
    from os.path import dirname, join, exists
    import ast

    # Check if the package is a single-file or multi-file package
    _candiates = [
        join(dirname(__file__), package + '.py'),
        join(dirname(__file__), package, '__init__.py'),
    ]
    _found = [init_fpath for init_fpath in _candiates if exists(init_fpath)]
    if len(_found) > 0:
        init_fpath = _found[0]
    elif len(_found) > 1:
        raise Exception('parse_version found multiple init files')
    elif len(_found) == 0:
        raise Exception('Cannot find package init file')

    with open(init_fpath, 'r') as file_:
        sourcecode = file_.read()
    pt = ast.parse(sourcecode)
    class VersionVisitor(ast.NodeVisitor):
        def visit_Assign(self, node):
            for target in node.targets:
                if getattr(target, 'id', None) == '__version__':
                    self.version = node.value.s
    visitor = VersionVisitor()
    visitor.visit(pt)
    return visitor.version
def parse_version ( package ) : from os . path import dirname , join , exists import ast # Check if the package is a single-file or multi-file package _candiates = [ join ( dirname ( __file__ ) , package + '.py' ) , join ( dirname ( __file__ ) , package , '__init__.py' ) , ] _found = [ init_fpath for init_fpath in _candiates if exists ( init_fpath ) ] if len ( _found ) > 0 : init_fpath = _found [ 0 ] elif len ( _found ) > 1 : raise Exception ( 'parse_version found multiple init files' ) elif len ( _found ) == 0 : raise Exception ( 'Cannot find package init file' ) with open ( init_fpath , 'r' ) as file_ : sourcecode = file_ . read ( ) pt = ast . parse ( sourcecode ) class VersionVisitor ( ast . NodeVisitor ) : def visit_Assign ( self , node ) : for target in node . targets : if getattr ( target , 'id' , None ) == '__version__' : self . version = node . value . s visitor = VersionVisitor ( ) visitor . visit ( pt ) return visitor . version
Statically parse the version number from __init__.py

    CommandLine:
        python -c "import setup; print(setup.parse_version('ubelt'))"
Statically parse the version number from __init__ . py