1 python中包的引入

当我们在不同的python文件中想要引入其他已经写好的函数时,这是就涉及引入包的过程。对于哪些直接引入一些官方的包或者通过pip下载的包,直接import即可,这里着重强调的是对于自己写的包。

1.1 test1和test2在同一个文件夹下

这里可以直接导入,因为两者在同一个文件夹下,那意味着其实两个文件就属于同一个包。同一个包下,两个文件当然可以相互引用。

1.2 test2在根目录下,test1在另一个文件夹下

这里也可以直接导入,虽然两者不在一个包下,但是在直接运行时的python包的扫描器能扫到test1的包。具体为什么能扫到,在1.3细说。

1.3 test2在一个包但不在根目录下,test1在一个文件夹下

这里就发生报错了,原因是python包的扫描器扫不到test1的包。

这里所谓的扫描器它扫描的路径可以通过sys.path来输出出来,我们可以看到test2它所扫描的路径实际上是test2的绝对路径:d:\\workspace\\pythonProjects\\testProject\\main,那么在这个情况下,test2中的引入包的语句:from src.test1 import fun_test1实际上会查询d:\\workspace\\pythonProjects\\testProject\\main\\src\\test1,实际上并没有这个路径,因此找不到这个包。

所以解决的方式很简单,只需通过sys.path.append()加入你的路径保证扫包的时候能扫到即可。在打印sys.path时我们注意到,还有一些其他的路径,正是这些路径保证我们能够正常引用官方的包或者pip下载下来的包。此时就解决我们直接运行时的问题了。当然,还有一种方法,通过直接命令行时添加-m参数,来使得包扫描器能够正常扫描。

2 调试时包的引入

在vscode的调试时,通过配置launch.json文件,我们可以实现不用在每个包中加入sys.path.append()的繁复操作,实现扫到所对应的包。env代表添加环境变量,PYTHONPATH代表扫包时的路径。

在这里再额外扩充一下有关vscode的内置变量的输出技巧:

在vscode中可以通过terminal->build tasks创建任务,然后在运行的任务中打印出相关变量即可查看。