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

如何从另一个目录导入具有文件相对路径的Python模块?,python,Python,我有一个带有子目录的Python项目,无法从子目录中的另一个模块导入根目录中的模块,这里是logger.py,这里是composite.py 问题是logger.py指向log目录中的日志文件,该文件具有相对路径名,因此composite.py无法从其子目录中找到此文件 如何从composite.py和根目录中的另一个模块(如module.py)导入模块logger ├── data/ module.py logger.py ├── composite/ │

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

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

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

├── data/
    module.py
    logger.py
    ├── composite/
    │   ├── composite.py
    ├── log/
    │   ├── info.log
这项工作:

data/logger.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'

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

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

logger.py
中,
os.path.dirname(\uuuuu file\uuuuuu)
'/home/abc/project/python/xyz/data'
。只需添加
日志
文件夹部分

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
来执行此操作

类似问题: 路径行为


有趣的相关阅读:

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

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

logger.py
中,
os.path.dirname(\uuuuu file\uuuuuu)
'/home/abc/project/python/xyz/data'
。只需添加
日志
文件夹部分

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
来执行此操作

类似问题: 路径行为


有趣的相关阅读:

你有没有尝试过
h\u info=RotatingFileHandler(os.path.join(os.path.dirname(\uu文件)、'log/info.log'),[…])
可能重复的@Vil no,它不是重复的。这个问题很经典,但很难标记为重复,因为OP文件的结构千变万化,您使用的是哪种python版本?@AmirMohsen我使用的是python 3.6您是否尝试过
h_info=RotatingFileHandler(os.path.join(os.path.dirname(uu文件),'log/info.log'),[…])
可能重复@Vil no,这不是这个的复制品。这个问题很经典,但很难标记为重复,因为OP文件的结构千变万化,您使用的是哪种python版本?@AmirMohsen我使用的是python 3.6谢谢,它工作得很好,但我需要将
log/info.log
而不是
。/log/info.log
加入模块路径,如
os.path.join(os.path.dirname(uu file_uu),'log/info.log')
嗯,我在这里也学到了一些新东西。我通常使用
os.getcwd()
。这里有一个关于哪个更好用的简介。谢谢,它工作得很好,但我需要将
log/info.log
加入模块路径,而不是
。/log/info.log
,就像在
os.path.join中一样(os.path.dirname(uuu file_uuu),'log/info.log')
嗯,我在这里也学到了一些新东西。我通常使用
os.getcwd()
。下面是一个关于哪个更好用的简介。