版权声明:本文为博主原创文章,未经博主允许不得转载。 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的话,可看到
两个都是错的。
总结的经验是:要用绝对就绝对,相对就相对。