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

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

猜你喜欢

转载自www.cnblogs.com/JCcodeblgos/p/10322824.html