P
|-A
| a.py
|-B
| b.py
文件结构如上,在windows下
a想运行b中的方法,可以直接写成
from B impot b
b.fun()
但是在linux中会出现
ModuleNotFoundError: No module named 'B'
可以通过引入sys添加路径解决
import sys
sys.path.append("/P")
from B impot b
在程序中为了也有良好的移植性,可以在代码中显式添加路径,
比如用os的方法:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
或者
os.getcwd()
或者pathlib 方法:
BASE_DIR = Path(__file__).resolve().parent.parent
最后可以添加到 sys.path中
sys.path.append(str(BASE_DIR))
但是要注意,追加的路径要与包导入想对应,要追加包的上一级
比如:
P
|-A
| a.py
|-B
| b.py
|---sub_B
| utils.py
如果路径中追加 /P ,那么导入模块要写成
from B.sub_B import utils
如果路径中追加/P/B,那么导入模块要写成
from sub_B import utils
python是解释性语言,所有相对路径都是相对于程序入口而言的,即程序启动时候所在的目录。如果要在P目录下启动 A/a.py , 和 在 A 目录下启动 a.py 程序中所写的相对路径是不同的,相对路径是相对于程序启动时候的当前目录而言的。在P目录下启动,那么当前目录就是 /P , A目录下启动当前目录就是 /P/A