1. 程式人生 > >python呼叫自己檔案函式/執行函式找不到包

python呼叫自己檔案函式/執行函式找不到包

寫python程式的時候很多人習慣建立一個utils.py檔案,存放一些經常使用的函式,方便其他檔案呼叫,同時也更好的管理一些通用函式,方便今後使用。或是兩個檔案之間的class或是函式呼叫情況。就像下面的工程目錄一樣:

工程目錄

Project\
    ...
    src\
        main.py
        utils.py
        test.py
        ...

python呼叫其他檔案中的函式

在main.py檔案中加入一下語句即可呼叫utils.py下面的函式:‘’

import src.utils as utils
X, y = utils.load_data()

開發python的習慣使用IDE,比如pycharm,pydev等,在這些IDE中使用方便,可以輕鬆的更換直譯器,在檔案右鍵執行即可,沒有問題。使用上述的方法也不會有其它問題。

可是當你現在本地寫code,然後發現本地計算資源不夠,想到了伺服器,伺服器是ubuntu的。於是乎用ssh [email protected]登入伺服器,然後選擇一個本人的檔案工程目錄下面用scp命令將原生代碼拷貝過去,或是用git clone https://github.com/xxx將程式碼倉庫程式碼拷貝到伺服器上,然後cd Project/,敲下python main.py,發現報出No module named ‘src’.錯誤,於是上網上搜程式碼,有人給出解決方案“把工程目錄裡面加入sys就行了”

import sys
sys.path.append('D:/pythonworkspace')

沒錯在本地是能解決問題,但是換個別的盤呢?又得改程式碼。在伺服器上呢,What? D盤?ubuntu哪來的D盤?還得改程式碼

原因

在檔案中寫下面兩句python程式碼

import sys
print(sys.path)

分別用pycharm和shell執行,發現兩個輸出的是不一樣的:
pycharm輸出:

D:\\pythonworkspace\\Project

shell輸出:

D:\\pythonworkspacr\\Projecrt\\src

有人覺得,原來是這個樣子,於是乎cd ..

,然後python src/test.py,可是發現還是會報錯,找不到module。
原因是pycharm執行檔案的時候路徑是整個工程下的路徑,而shell執行檔案的時候是執行檔案所在的路徑,不是shell所在的檔案路徑。

解決

所以正確的姿勢是這個樣子

import sys
sys.path.append("..")

先把相對路徑轉換成絕對路徑,然後將絕對路徑加入系統變數中就行了。這樣就可以在不用的場景下使用python命令,和靈活的使用其他檔案下的函數了,不會報錯。如果包含多級目錄就繼續加sys.path.append("../..")