zoukankan      html  css  js  c++  java
  • python的相对导入

    最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下

    导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了

    先定义一个包

    adb包

    这个包里面有2个py文件

    __init__.py

    app.py

    两个文件代码如下

    __init__.py

    import os
    class Main:
        def __init__(self):
            pass
        def shows(self):
            return "ss"
    
    main = Main()
    text = os.getcwd()

    app.py

    from . import main
    from . import text
    
    
    class Adb:
        def __init__(self, name):
            self.name = name
    
        def show(self):
            return self.name

    我们单独执行app.py的话会报错

    说是找不到main模块

    这是为啥呢,后来百度了一番,虽然自己还不明白,但是大概意思是说,这种相对路径导入方法,不能直接执行这个app.py文件,需要别的py文件来调用这个adb包,才能执行app里导入的东西,那我们就创建一个Py文件,创建的这个py文件在adb文件夹的上一目录

    看下代码

    test.py

    from adb import app
    x = app.Adb("joke")
    print(x.show())
    print(app.main.shows())
    print(app.text)

    执行这个文件看下结果

    这次结果正确了

    虽然还不是很明白,但是至少知道怎么使用了,包内py文件导入当前目录内的其他py文件定义的类,函数或者变量等,导入后,直接执行包内的这个py文件是会报错的,也就是包内相对导入后,只能在包的外部导入这个包来调用。

    相对导入只能用于同一个package里,并且包内的文件不能单独运行

    也就是说在adb这个包里

    __init__.py和app.py可以相互导入相互定义的东西,但是不能导入包外其他py文件定义的,并且导入后这2个py文件都不能单独运行了

  • 相关阅读:
    在Swift中定义属于自己的运算符
    计算型属性 vs 懒加载
    swift- mutating
    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
    微信授权登录-微信公众号和PC端网站
    PHP实现购物车的思路和源码分析
    PHP实现图片的等比缩放和Logo水印功能示例
    PHP实现IP访问限制及提交次数的方法详解
    Laravel 队列发送邮件
    laravel 定时任务通过队列发送邮件
  • 原文地址:https://www.cnblogs.com/hh2737/p/9324188.html
Copyright © 2011-2022 走看看