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

时间:2018-08-18 10:12:01

标签: python

我有一个带有子目录的Python项目,并且无法从子目录(logger.py)中的另一个模块导入位于根目录(composite.py)中的模块。

问题是logger.py指向log目录中的日志文件,并且指向该文件的相对路径,因此composite.py无法从其子目录中找到此文件。

如何从logger和根目录中的另一个模块(例如composite.py)导入模块module.py

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

这项工作:

data / logger.py:

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

data / module.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 个答案:

答案 0 :(得分:3)

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

由于您从打开日志的文件中知道日志文件的相对路径,因此可以使用os.path.dirname(__file__)找到当前目录模块,然后加入其余的目录:

logger.py中的

中,os.path.dirname(__file__)'/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__))