1. 程式人生 > 其它 >pycharm下可以執行python專案,Linux命令列下報錯無法導包,且sys.path.appen()新增環境變數無效

pycharm下可以執行python專案,Linux命令列下報錯無法導包,且sys.path.appen()新增環境變數無效

OutLine

Pycharm 中完成編碼,且在 Pycharm 中可正常執行,以為就萬事大吉了,但在Linux命令列中執行時,報錯:找不到所匯入的包;

先看下目錄結構:

  • from scripts import * 我在 scripts/__init__.py 中寫了一個基類,供後續繼承使用
  • dump_factor.py 執行的py檔案
  • dump_factor.py 中也 sys.path.append 添加了環境變數(把專案根目錄新增到環境變數)

網上各種類似問題,也都可以通過 sys.path.append新增環境變數解決,理論上我這個也可以這麼解決;

但新增環境變數後,依然報錯,提示找不到包;

因此進行debug定位下問題,並且記錄下;

報錯示例:

Python匯入模組的搜尋順序(原理)

python 直譯器查詢包(模組)的順序:

  1. 記憶體(模組快取)
  2. 內建模組 built-in module(例如:sys、os, 可通過sys.builtin_module_names檢視)
  3. sys.path (環境變數中)
    sys.path 列表中 index:0 (第一個元素),為被執行python檔案所在目錄,優先順序最高
  4. 標準庫 (可通過sys.modules檢視)
  5. .pth 檔案(python會尋找.pth檔案,然後將檔案里路徑加入 sys.path)
  6. 第三方庫(你pip install的庫)

內建模組:

sys.path:

標準庫:

問題分析

檢視當前 sys.path 環境變數中是否有所需路徑

上圖是我 sys.path.append() 後的環境變數列表;

可以看到:

/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被執行py檔案所在目錄)

/home/mdlib/git_pro/mj-data-sdk (專案根目錄)

<專案根目錄、被執行py檔案所在目錄> 都有了,按理說python會去遍歷 sys.path 列表,肯定能找到對應環境變數(因為我已經append進去了);

但實際執行時,依然提示找不到模組。

問題解決

因為sys.path 列表中 index:0 位置,是被執行python檔案所在目錄,優先順序最高,會第一個找這個目錄;

而我append進去的專案根目錄 </home/mdlib/git_pro/mj-data-sdk>,在最後面

沒等找到它,就先遇到了/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被執行py檔案所在目錄),就直接用了

從目錄結構來看,/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor 下面是沒有 scripts 的,自然沒法匯入scripts,就會找不到報錯;

但在專案根目錄視角下,就有scripts了,就可以匯入了;

所以,就當前情況而言,sys.path 中 index:0 位置的路徑,應該是專案根目錄:

這麼操作即可

import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.insert(0, os.path.split(rootPath)[0])

把專案根目錄 insert 到 sys.path 列表第一個元素,python找的時候就會先找到 專案根目錄。

總結

當你在pycharm中完成編碼,執行程式碼時,pycharm會動態幫你把一切都做好,基本不會出現類似導包出錯問題;

但在命令列情況下,就需要注意是否存在該問題了;