Package for listing version of packages used in a Jupyter notebook

前端 未结 7 1173
遥遥无期
遥遥无期 2020-12-13 19:50

I seem to remember there is a package that printed the versions and relevant information about Python packages used in a Jupyter notebook so the results in it were reproduci

7条回答
  •  被撕碎了的回忆
    2020-12-13 20:25

    I made some improvements to @Alex P. Miller's answer so that (sorry I don't have enough reps to "comment" directly on his answer)

    1. Automatically works with module names where case sensitivity was causing problems
    2. Also lists modules without version numbers as "unknown" to make it clear it couldn't find a match.
    3. also lists built in modules if it can detect it.
    # show versions of packages
    # adopted from https://stackoverflow.com/questions/40428931/package-for-listing-version-of-packages-used-in-a-jupyter-notebook
    
        def get_imports():
            for name, val in globals().items():
                if isinstance(val, types.ModuleType):
                    # Split ensures you get root package, 
                    # not just imported function
                    name = val.__name__.split(".")[0]
                elif isinstance(val, type):
                    name = val.__module__.split(".")[0]
                # Some packages are weird and have different
                # imported names vs. system/pip names. Unfortunately,
                # there is no systematic way to get pip names from
                # a package's imported name. You'll have to add
                # exceptions to this list manually!
                poorly_named_packages = {
                    "sklearn": "scikit-learn"
                }
                if name in poorly_named_packages.keys():
                    name = poorly_named_packages[name]
                yield name.lower()
        imports = list(set(get_imports()))
    
        # The only way I found to get the version of the root package
        # from only the name of the package is to cross-check the names 
        # of installed packages vs. imported packages
        modules = []
        for m in sys.builtin_module_names:
            if m.lower() in imports and m !='builtins':
                modules.append((m,'Python BuiltIn'))
                imports.remove(m.lower())
    
        for m in pkg_resources.working_set:
            if m.project_name.lower() in imports and m.project_name!="pip":
                modules.append((m.project_name, m.version))
                imports.remove(m.project_name.lower())
    
        for m in sys.modules:
            if m.lower() in imports and m !='builtins':
                modules.append((m,'unknown'))
    
        # print('System=='+platform.system()+' '+platform.release()+'; Version=='+platform.version())
        for r in modules:
            print("{}=={}".format(*r))
    

提交回复
热议问题