BASE_DIR的使用
文件的基本目录结构如下:
通常情况下bin作为入口程序,在bin中调用mudule中的main函数,而main中调用了本模块中的logger_test中的函数,需要完成以下导入:在bin.py中导入mudule中main.py。导入方式如下:
import mudule.main
在main.py中导入looger_test导入方式如下:
from mudule import logger_test
程序在pycharm中运行没有问题,可以正常执行,但是在命令行模式下执行会报错
Traceback (most recent call last): File "bin.py", line 11, in <module> import mudule.main ModuleNotFoundError: No module named ‘mudule‘
原因如下:python解释器搜索模块位置的顺序如下1、搜索当前目录 2、如果当前目录没有则查看path路径。在pycharm中其path路径在动添加了当前项目,使用
import sys for i in sys.path: print(i)
输出结果如下:
C:\Users\华为\PycharmProjects\ATM\venv\Scripts\python.exe C:/Users/华为/PycharmProjects/ATM/venv/bin/bin.py C:\Users\华为\PycharmProjects\ATM\venv\bin C:\Users\华为\PycharmProjects\ATM C:\Program Files\JetBrains\PyCharm 2019.3.3\plugins\python\helpers\pycharm_display C:\Users\华为\AppData\Local\Programs\Python\Python38-32\python38.zip C:\Users\华为\AppData\Local\Programs\Python\Python38-32\DLLs C:\Users\华为\AppData\Local\Programs\Python\Python38-32\lib C:\Users\华为\AppData\Local\Programs\Python\Python38-32 C:\Users\华为\PycharmProjects\ATM\venv C:\Users\华为\PycharmProjects\ATM\venv\lib\site-packages C:\Users\华为\PycharmProjects\ATM\venv\lib\site-packages\setuptools-40.8.0-py3.8.egg C:\Users\华为\PycharmProjects\ATM\venv\lib\site-packages\pip-19.0.3-py3.8.egg C:\Program Files\JetBrains\PyCharm 2019.3.3\plugins\python\helpers\pycharm_matplotlib_backend
其中包含了当前根目录:C:\Users\华为\PycharmProjects\ATM\venv,这是pycharm为我们添加进去的,但是在命令行模式下,执行python bin.py,则输出结果如下:
C:\Users\华为\PycharmProjects\ATM\venv\bin C:\Users\华为\AppData\Local\Programs\Python\Python38-32\python38.zip C:\Users\华为\AppData\Local\Programs\Python\Python38-32\DLLs C:\Users\华为\AppData\Local\Programs\Python\Python38-32\lib C:\Users\华为\AppData\Local\Programs\Python\Python38-32 C:\Users\华为\AppData\Local\Programs\Python\Python38-32\lib\site-packages
并不包含当前项目的目录,我们在bin.py中使用import mudule.main编译器会在bin目录下搜索mudule模块,而mudule实在venv目录下,因此在当前目录和path路径下都搜索不到mudule模块,因此在命令行模式下报错。
解决方案如下:将当前项目路径包含到path路径下,可以使用以下命令
sys.path.append(r‘"C:\Users\华为\PycharmProjects\ATM\venv")
此方案可以解决,但是会存在一个问题,使用了绝对路径,当项目拷贝到其他位置后仍然会报错,因此需要使用相对位置去解决这个问题。分两步,1、找到当前文件的路径。
os.path.abspath(__file__) #返回:C:\Users\华为\PycharmProjects\ATM\venv\bin\bin.py
2、找到当前文件路径的项目根目录,并添加到path中
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
将以上代码放到bin.py的最前面则可以解决以上问题。