Return a list of imported Python modules used in a script?

后端 未结 13 2230
深忆病人
深忆病人 2020-11-30 00:23

I am writing a program that categorizes a list of Python files by which modules they import. As such I need to scan the collection of .py files ad return a list of which mod

13条回答
  •  天命终不由人
    2020-11-30 01:15

    Thanks Tony Suffolk for inspect, importlib samples ... I built this wee module and you're all welcome to use it if it helps you. Giving back, yaaaay!

    import timeit
    import os
    import inspect, importlib as implib
    import textwrap as twrap
    
    def src_modules(filename):
        assert (len(filename)>1)
    
        mod = implib.import_module(filename.split(".")[0])
        ml_alias = []
        ml_actual = []
        ml_together = []
        ml_final = []
        for i in inspect.getmembers(mod, inspect.ismodule):
            ml_alias.append(i[0])
            ml_actual.append((str(i[1]).split(" ")[1]))
            ml_together = zip(ml_actual, ml_alias)
        for t in ml_together:
            (a,b) = t
            ml_final.append(a+":="+b)
    
        return ml_final
    
    def l_to_str(itr):
        assert(len(itr)>0)
    
        itr.sort()
        r_str = ""
        for i in itr:
            r_str += i+"  "
        return r_str
    
    def src_info(filename, start_time=timeit.default_timer()):
        assert (len(filename)>1)
    
        filename_in = filename
        filename = filename_in.split(".")[0]
    
        if __name__ == filename:
            output_module = filename
        else:
            output_module = __name__
    
        print ("\n" + (80 * "#"))
        print (" runtime ~= {0} ms".format(round(((timeit.default_timer() - start_time)*1000),3)))
        print (" source file --> '{0}'".format(filename_in))
        print (" output via --> '{0}'".format(output_module))
        print (" modules used in '{0}':".format(filename))
        print ("  "+"\n  ".join(twrap.wrap(l_to_str(src_modules(filename)), 75)))
        print (80 * "#")
    
        return ""
    
    
    if __name__ == "__main__":
        src_info(os.path.basename(__file__))
    
    
    ## how to use in X file:
    #
    # import print_src_info
    # import os
    #
    # < ... your code ... >
    #
    # if __name__ == "__main__":
    #     print_src_info.src_info(os.path.basename(__file__))
    
    
    ## example output:
    #
    # ################################################################################
    #  runtime ~= 0.049 ms
    #  source file --> 'print_src_info.py'
    #  output via --> '__main__'
    #  modules used in 'print_src_info':
    #   'importlib':=implib  'inspect':=inspect  'os':=os  'textwrap':=twrap
    #   'timeit':=timeit
    # ################################################################################
    

提交回复
热议问题