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

How to import a Python module with relative path to a file from another directory?

我有一个具有子目录的python项目,无法从子目录中的另一个模块(这里是EDOCX1[0])导入根目录中的模块(这里是EDOCX1[1])。

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

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

1
2
3
4
5
6
7
├── data/
    module.py
    logger.py
    ├── composite/
    │   ├── composite.py
    ├── log/
    │   ├── info.log

这项工作:

数据/记录器.py:

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

数据/模块.py:

1
import logger

这不起作用:

数据/复合/复合.py:

1
2
3
from data import logger

FileNotFoundError: [Errno 2] No such file or directory: '/home/abc/project/python/xyz/data/composite/log/info.log'


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

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

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

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

或者以更便携的方式:

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

永远不要用相对路径引用资源/外部文件。始终使用配置文件中的绝对路径或使用此技术来确保启动目录。千万不要用os.chdir来做这件事。

类似问题:奇怪的python文件路径行为路径行为

有趣的相关阅读:os.getcwd()vs os.path.abspath(os.path.dirname(uuu file_uuuuu))。