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
以上是自己的一点浅显看法,欢迎大家批评指正!