代码之家  ›  专栏  ›  技术社区  ›  Florent

如何从另一个目录导入具有文件相对路径的Python模块?

  •  0
  • Florent  · 技术社区  · 6 年前

    我有一个带有子目录的Python项目,无法导入根目录中的模块,这里 logger.py ,来自子目录中的另一个模块,这里 composite.py .

    日志程序.py log 具有相对路径名的目录,因此 合成.py 无法从其子目录中找到此文件。

    logger 合成.py 从根目录中的另一个模块,比如 module.py ?

    ├── data/
        module.py
        logger.py
        ├── composite/
        │   ├── composite.py
        ├── log/
        │   ├── info.log
    

    数据/记录器.py:

    h_info =      RotatingFileHandler('log/info.log', [...])
    

    数据/模块.py:

    import logger
    

    这不起作用:

    data/composite/composite.py文件:

    from data import logger
    
    FileNotFoundError: [Errno 2] No such file or directory: '/home/abc/project/python/xyz/data/composite/log/info.log'
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Jean-François Fabre    6 年前

    它不起作用,因为您的代码依赖于当前目录来打开日志文件。

    因为您从打开日志的文件中知道日志文件的相对路径,所以可以使用 os.path.dirname(__file__)

    在里面 logger.py , os.path.dirname(文件名) '/home/abc/project/python/xyz/data' . 只需添加 log 文件夹部分。

    h_info = RotatingFileHandler(os.path.join(os.path.dirname(__file__),'log/info.log'), [...])
    

    h_info = RotatingFileHandler(os.path.join(os.path.dirname(__file__),"log","info.log"), [...])
    

    不要引用具有相对路径的资源/外部文件。始终使用配置文件中的绝对路径,或使用此技术确保起始目录。从不使用 os.chdir 要么这样做。

    类似问题: Weird python file path behavior 路径行为

    os.getcwd() vs os.path.abspath(os.path.dirname(__file__))