我有一个带有子目录的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'
答案 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__))