首页 文章

导入模块与文件同名[复制]

提问于
浏览
4

这个问题在这里已有答案:

我想将日志https://docs.python.org/3/library/logging.html导入名为logging.py的文档中 . 当我尝试导入logging.handlers时,它失败了,因为我相信它正在搜索文档中的处理程序函数,而不是从模块导入 . 我该如何解决这个问题,它会寻找更高级别的日志记录,而不是查看文件内部?

2 回答

  • 1

    你可以通过从python路径中删除当前目录(在sys.path中的第一个)来完成它:

    import sys
    sys.path = sys.path[1:]
    import logging
    print dir(logging)
    

    测试:

    $ python logging.py 
    ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
     'FATAL', 'FileHandler', 'Filter', 'Filterer', 'Formatter', 'Handler',
     'INFO', 'LogRecord', 'Logger', 'LoggerAdapter', 'Manager', 'NOTSET', 
     'NullHandler', 'PlaceHolder', 'RootLogger', 'StreamHandler', 'WARN',
     'WARNING', '__all__', '__author__', '__builtins__', '__date__',
     '__doc__', '__file__', '__name__', '__package__', '__path__',
     '__status__', '__version__', '_acquireLock', '_addHandlerRef',
     '_checkLevel', '_defaultFormatter', '_handlerList', '_handlers',
     '_levelNames', '_lock', '_loggerClass', '_releaseLock',
     '_removeHandlerRef', '_showwarning', '_srcfile', '_startTime',
     '_unicode', '_warnings_showwarning', 'addLevelName', 'atexit',
     'basicConfig', 'cStringIO', 'captureWarnings', 'codecs', 'critical',
     'currentframe', 'debug', 'disable', 'error', 'exception', 'fatal',
     'getLevelName', 'getLogger', 'getLoggerClass', 'info', 'log',
     'logMultiprocessing', 'logProcesses', 'logThreads', 'makeLogRecord',
     'os', 'raiseExceptions', 'root', 'setLoggerClass', 'shutdown', 'sys',
     'thread', 'threading', 'time', 'traceback', 'warn', 'warning',
     'warnings', 'weakref']
    
  • 0

    如果您使用的名称与标准库名称相同,则可以使用 distutils.sysconfig.get_python_lib 首先在路径中插入标准的lib软件包目录,以找到目录,这仍然可以使用脚本目录中的任何软件包:

    import sys
    import distutils.sysconfig as sysconfig
    sys.path.insert(0, sysconfig.get_python_lib(standard_lib=1))
    
    import logging
    print(logging.__file__)
    

    输出:

    $ python3 logging.py 
    /usr/lib/python3.4/logging/__init__.py
    $ python logging.py 
    /usr/lib/python2.7/logging/__init__.pyc
    

    如果要将路径设置回正常,可以弹出,导入仍然有效:

    import sys
    import distutils.sysconfig as sysconfig
    sys.path.insert(0, sysconfig.get_python_lib(standard_lib=1))
    print(sys.path)
    import logging
    sys.path.pop(0)
    print("")
    print(logging.__file__)
    print("")
    print(sys.path)
    

    输出:

    $ python3 logging.py 
    ['/usr/lib/python3.4', '/home/padraic', '/home/padraic/mymods', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/padraic/.local/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.4/dist-packages']
    
    /usr/lib/python3.4/logging/__init__.py
    
    ['/home/padraic', '/home/padraic/mymods', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/padraic/.local/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.4/dist-packages']
    

相关问题