文件的基本目錄結構如下:
通常情況下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的最前面則可以解決以上問題。