【小白学python】模块导入错误

一、日志

ImportError: attempted relative import with no known parent package

ValueError: attempted relative import beyond top-level package

二、顺藤摸瓜

1.解释器的搜索路径

>>> import sys

>>> sys.path

['', 'D:\\python\\Lib\\idlelib', 'D:\\python\\python35.zip', 'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', 'D:\\python\\lib\\site-packages']

· 可以自己在运行时添加,但运行结束之后失效

sys.path.append('绝对路径名')

· 还可以去操作系统中设置环境变量

1. UNIX和MacOSX 在每次登陆都要设置的shell设置环境变量

export PYTHONPATH = $PYTHONPATH:~/python,多个路径冒号分隔不同shell有所不同,具体查看相关文档

2.Windows

菜单--设置--控制面板--系统--高级--环境变量(系统变量,用户变量)

系统变量对所有用户都支持,用户变量只对所设置的用户

如果有过PYTHONPATH,选中,单击编辑

如果没有,单击新建,输入目录作为变量值,多个以分号分隔

如仍不行,编辑autoexec.bat文件,用记事本或IDLE编辑器打开,增加一行,设置PYTHONPATH



2. 解释器搜索顺序:内—脚—环—库

        “脚”指的是当前脚本所在路径

3.python文件夹

libs:内置库

Lib:标准库(这里python交互式执行给出的文本是小写的lib,windows也识别)

site-packages:第三方库

操作系统设置中配置环境变量:D:\python

DLLs动态链接库,与解释器相关

scripts,可执行的脚本文件,比如selenium可以放在这个下面

4.模块和包的导入

import 模块名1,模块名2...

from 路径 import 模块名

import 包名

import 包名.模块名

from 包名 import 模块名

from 包名.模块名 import 属性/变量/类/方法/函数名

不要循环引用

A导入B,B导入C,C导入D,D导入A,死循环

示例:

from requests.package.urlib3.exceptions import InsecureRequestWarning

from . import  模块名:从当前路径导入

from .. import模块名:从父路径导入

from 模块名 import *

上面从父路径导入,父路径并没有被python视作包,所以报错:

ValueError: attempted relative import beyond top-level package

父路径有__init__.py仍然没有被视作package

因为有__main__.py它是主函数的入口,因此解释器不把父文件夹视作包

5.模块导入的执行情况

执行模块代码时首先会加载__init__.py 定义的引入模块,然后进入__mian__.py 文件运行

from包1 import 包2,调用顺序是包1,包2。

三、拓展阅读

库们:

http://www.360doc.com/content/18/0529/21/3175779_758069027.shtml

你可能感兴趣的:(【小白学python】模块导入错误)