python模块导入的问题

看python requests的源码,其中有如下代码

图片描述

from . import utils其中的点是什么意思,直接在命令行上执行是报错的

[yaxin@cube2x requests]$ls
adapters.py  auth.py     certs.py   cookies.py     hooks.py     models.py  sessions.py      structures.py
api.py       cacert.pem  compat.py  exceptions.py  __init__.py  packages   status_codes.py  utils.py
[yaxin@cube2x requests]$python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from . import utils
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Attempted relative import in non-package
>>> 
阅读 4.3k
4 个回答

. 表示当前的工作目录

在python中 应该是默认引用 ____init____.py

. 相对当前工作目录
如果不在当前目录环境,则将.替换为完整的模块路径

. 是路径啦!

假设有以下项目结构:

project/
    main.py
    module/
        module1.py

main.py中,需要导入module1.py中的函数或类。如果直接使用import module1,会发现无法成功导入。这是因为Python解释器默认只会搜索当前目录和sys.path中的路径。为了解决这个问题,可以在代码中添加sys.path.append()

sys.path简介

sys.path是一个Python列表,用于存储Python解释器搜索模块的路径。当尝试导入一个模块时,Python解释器会依次检查sys.path中的每个路径,看是否存在对应的模块。如果找到了,就会将该模块导入;如果没有找到,就会抛出ModuleNotFoundError异常。

解决方案

要解决无法导入同级目录下的模块的问题,可以在main.py中添加以下代码:

import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

这段代码首先导入了sysos模块。然后,使用os.path.dirname()os.path.abspath()函数获取当前文件的绝对路径,并将其添加到sys.path中。这样,Python解释器就可以正确识别到同级目录下的模块了。

接下来,就可以正常地导入module1.py中的函数或类了:

from module import module1
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题