Zexian Li

VScode跨文件夹导入Python包踩坑实录

2020-09-11 · 2 min read


在VScode跨文件夹导入包时遇到了一些奇妙问题,mark一下(据传Pycharm没有这些问题,但颜党表示VScode永香)。

任务

目录如下所示:

-- test
-- -- a
-- -- -- b.py
-- -- c
-- -- -- d.py

任务:需要在d.py中调用b.py中名为hello的类。

解决思路

基本思路就是通过sys.path.append()语句添加路径,以便检索对应的包,最后却被命令行的路径问题搞了心态。

bug复现

重点在于命令行所处的状态。终端的显示正常是这样的:
PS C:\Users\lizex\Desktop\test>
而此时若我们直接点击右上角的绿色按钮,会执行下述命令:
PS C:\Users\lizex\Desktop\test> & D:/Python3/python.exe c:/Users/lizex/Desktop/test/b/d.py
此时运行下述代码,就会报错ModuleNotFoundError: No module named 'a'

import sys
sys.path.append('..')
print(sys.path)
""" 
sys.path
['c:\\Users\\lizex\\Desktop\\test\\b', 'D:\\Python3\\python37.zip', 
'D:\\Python3\\DLLs', 'D:\\Python3\\lib', 'D:\\Python3', 
'D:\\Python3\\lib\\site-packages', '..']
"""
import a.c

分析可知,VScode的地址解析会将当前执行文件的路径加入sys路径,而鉴于是在C:\Users\lizex\Desktop\test下添加了..路径,实际上sys最后加入的路径是C:\Users\lizex\Desktop,此时执行import a.c就自然报错。

解决方法

在分析清楚问题之后,解决就很容易,可通过将命令行地址改成C:\Users\lizex\Desktop\test\b后执行sys.path.append('..')来解决,也可不改变地址,直接sys.path.append('.')来解决。

Bad decisions make good stories.