Python相对导入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hguo11/article/details/82291540

问题1

这里要说明的问题是
from . import 以及
from .. import
大致按照图建下目录
这里写图片描述

各个脚本文件中的代码如下
fun3.py

from .. import fun2

if __name__ == '__main__':
    fun2.print_fun2()

fun2.py

from . import fun1

def print_fun2():
    fun1.print_fun1()
    print("fun2")


if __name__ == '__main__':
    print_fun2()

fun1.py

def print_fun1():
    print("fun1")


if __name__ == '__main__':
    print_fun1()

如果直接运行fun3.py,则会报错
这里写图片描述

如果运行fun.py,则会报错
这里写图片描述

这就尴尬了,这里的from .和from ..没有错呀,就是本级目录和上级目录呀,为啥为报这个错?

这里的具体原因主要是包以及模块里的调用关系,比较复杂,这里就不详细说了,上面虽然运行出错,但是解决方法可以到其对于的包的目录运行。

D:\untitled>python -m pack1.innerpack1.fun3
fun1
fun2
D:\untitled>python -m pack1.fun2
fun1
fun2

这样就可以,到包的目录下去执行就可以,

如果按照以下来

D:\untitled\pack1>python -m innerpack1.fun3
Traceback (most recent call last):
  File "D:\Python35\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "D:\Python35\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\untitled\pack1\innerpack1\fun3.py", line 1, in <module>
    from .. import fun2
ValueError: attempted relative import beyond top-level package
D:\untitled\pack1>python -m fun2
Traceback (most recent call last):
  File "D:\Python35\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "D:\Python35\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\untitled\pack1\fun2.py", line 1, in <module>
    from . import fun1
ImportError: attempted relative import with no known parent package

可以看到会出错的。

如果想在脚本文件中可以运行的话,可以改一下为绝对路径
fun2.py

from pack1 import fun1

def print_fun2():
    fun1.print_fun1()
    print("fun2")


if __name__ == '__main__':
    print_fun2()

比如说这里的代码可这么改。
fun3.py

from pack1 import fun2

if __name__ == '__main__':
    fun2.print_fun2()

这样就可以了。


问题2

我们全部使用相对导入
项目的结构试图如下:
这里写图片描述
各个脚本文件的代码如下:
这里写图片描述
这里写图片描述
这里写图片描述
下面我启动命令行运行代码
这里写图片描述
可以看到,直接运行脚本文件是会报错的,通过python -m的方式来运行是不会出错的。至于python -m 的作用,可以参考链接
再次运行其它的函数
这里写图片描述
也是同样的规律,只要我们里面用了from ..或者from.来导入的话,那么用python -m 到顶级包下面取执行的话,肯定是没有错的。但是我们用python来直接执行的话就是会有错的。

如果我们改了一个文件的代码,fun1.py文件,改成如下:
这里写图片描述

我们执行pycham的run 以及命令行里的两个python命令后得到。
这里写图片描述
可以看到两个命令行的都是对的。如果这时再运行func_test的话,可看到
这里写图片描述
两个都是错的。

总结的经验是:要用绝对就绝对,相对就相对。

猜你喜欢

转载自blog.csdn.net/hguo11/article/details/82291540