• python import的一些问题


    python 在import 自己些的包的适合会出现一些奇怪的问题,尤其是在vs code这种编程环境比较宽松的情况下,自己找了一些资料来解决这个问题但是经过反复的实验都没有成功,因此些一些自己的体会。
    首先推荐一篇博客:https://pyliaorachel.github.io/blog/tech/python/2017/09/15/pythons-import-trap.html 具体的import细节技术可以看这里(PS:按着这个里面引包的方法也会出现错误!)

    概念

    • 1.module 组建 指一个file 也就是一个.py文件
    • 2.package 包 有多个module 或者 package 组成
    • _init_.py 一般都为空 告诉这个文件夹 是一个package
    • _main_.py 用来执行所有与函数 一般写在项目的一级目录下
    • _pycache_.py 只要package的module被调用就会自动生成一个这样的文件,下面还有相应的.pyc文件。

    目前经过自己的尝试,在在同一个package下进行到的调取是没有问题的,可以随便调用,但是在多个package之间进行包的调取就会出现一系列问题,常见问题

    • 1.ImportError: cannot import name ***
    • 2.ValueError: attempted relative import beyond top-level package
    • 3.ModuleNotFoundError: No module named 'main.**'; 'main' is not a package

    综合上面的问题,以及自己实践可以发现,在vscode中向下调用package和module是可以的,但是要向上调用就用会出现问题,在pycharm这一点是可以避免的,因为pycharm是一个整体的运行环境,你即使写了很多的package再要在一个项目下都是可以根据相互之间合理的调用关系,从而进行调用的。但是vscode就不行,它每次运行的环境(目录)是具体到单个.py文件目录下,而不是像pycharm一样python的运行环境是项目的目录,所以要是在vscode里面安全的调用你写package就只有一个办法,把运行的main函数文件下载项目的最顶层,然后其他package依次向下调用就可以了。


    仔细展开

    package1/haha.py

    def hafun():
        print("package1 hafun")
    

    package2/haha2.py

    from package1 import haha
    
    
    def hafun2():
        haha.hafun()
        print("package2 hafun2")
    
    

    package2与package1是同一级的,但是由于我们的__main__.py最终运行的目录是和package2与package1同一级,所以这里package2/haha2.py文件调用package1/haha.py文件的书写方法实际上是站在__main__.py这层目录的角度进行书写的。即from package1 import haha。调用package的方式个__main__.py 一样 即 from package1 import haha 和 from package2 import haha2。

    main.py 函数进行最终调试调用

    from package1 import haha
    from package2 import haha2
    
    haha.hafun()
    haha2.hafun2()
    

    运行结果:

    package1 hafun
    package1 hafun
    package2 hafun2
    

    以上是自己的一点浅显看法,欢迎大家批评指正!

  • 相关阅读:
    SQL Server执行计划的理解
    SQL Server Profiler工具
    利用SQL Profiler处理开销较大的查询
    查询开销
    详解索引连接类型
    详解执行计划
    数据库引擎调整顾问
    six.moves的用法
    ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
    C++ 线程的创建,挂起,唤醒,终止
  • 原文地址:https://www.cnblogs.com/JCcodeblgos/p/10322824.html
Copyright © 2020-2023  润新知