python 子包呼叫 跨目錄呼叫

2022-03-26 19:56:23 字數 3105 閱讀 6343

簡單來講,模組是乙個包含python定義和語句的檔案,包是一種通過用「帶點號的模組名」來構造 python 模組命名空間的方法。

詳細可以參考廖雪峰的:python教程-模組

使用的python版本:3.7.0

平台:win10

假如在main.py中呼叫pack.mod1.py中的函式func1,而func1又呼叫pack2.mod2.py中的func2函式,各個檔案中的**如下:

main.py:

import

sysprint("

file:{},sys.path:{}

".format(__file__

, sys.path))

from pack1 import

mod1

if__name__ == "

__main__":

mod1.func1()

pack1/mod1.py:

from pack2 import

mod2

deffunc1():

print("

this is pack1.mod1")

mod2.func2()

pack2/mod2.py:
def

func2():

print("

this is pack2.mod2

")

進入test_mod目錄,執行命令:

python main.py
輸出:

file:main.py,sys.path:['

d:\\1-work\\python_src\\test_mod

',

'

', '

', '',

'', '

', '']

this

ispack1.mod1

this

is pack2.mod2

可以看出sys.path中的第乙個元素,就是main.py所在的目錄,因為包pack1和pack2都在這個目錄下,所以它們能夠互相發現。

假如這個時候,你想單獨除錯一下pack1.mod1.func1函式,將mod1.py修改如下:

import sys

print(

"file:{},sys.path:{}

".format(__file__, sys.path))

from pack2 import mod2

def func1():

print(

"this is pack1.mod1")

mod2.func2()

if __name__ == "

__main__":

func1()

進入pack1目錄執行:

python mod1.py
輸出如下:

file:mod1.py,sys.path:['

d:\\1-work\\python_src\\test_mod\\pack1

',

'

', '

', '

', '

', '

', '']

traceback (most recent call last):

file

"mod1.py

", line 3, in

from pack2 import

mod2

modulenotfounderror: no module named

'pack2

'

發現sys.path的第乙個路徑已經是test_mod/pack1了,在這個目錄下面直譯器無法找到pack2這個包。

如果需要發現這個包,按照python搜尋路徑的規則,需要將test_mod這個目錄加入到sys.path中,一般來說可以:

使用最後一種辦法,將pack1.mod1.py修改為:

import

sys"d:\\1-work\\python_src\\test_mod"

)print("

file:{},sys.path:{}

".format(__file__

, sys.path))

from pack2 import

mod2

deffunc1():

print("

this is pack1.mod1")

mod2.func2()

if__name__ == "

__main__":

func1()

結果輸出:

file:mod1.py,sys.path:['

d:\\1-work\\python_src\\test_mod\\pack1

', '

', '

', '

', '

', '

', '

', '

d:\\1-work\\python_src\\test_mod

']

為什麼使用絕對路徑呢,因為如果使用相對路徑的話,當前工作路徑一變就不行了,不信在test_mod目錄執行

python pack1/mod1.py
或者用vscode等文字編輯器開啟test_mod目錄,然後直接f5執行,工作目錄就是test_mod,而不是pack1,這個時候新增的」../」路徑就會變成目錄python_src。

所以一切的關鍵還是模組搜尋路徑。

回到解決方式上面,或者將專案的路徑加到pythonpath環境變數,或者寫入.pth並放在搜尋路徑中才是一勞永逸的方式。

(1) python3文件-模組

(2) 廖雪峰:python教程-模組

(完)

python跨目錄呼叫

本文介紹pyhton的跨目錄呼叫問題。在python中有時候我們需要呼叫另一.py檔案中的方法或者類。如果該.py檔案與當前檔案位於同一目錄下那麼問題非常容易解決。如果兩個.py檔案位於不同的目錄下就比較麻煩。下面分別介紹如下 1.兩個.py檔案位於同一目錄下 假設兩個.py檔案分別為test1.p...

python 跨目錄呼叫檔案

如果呼叫檔案與被呼叫檔案在同乙個目錄下,則可以非常方便的呼叫。如果呼叫檔案與被呼叫檔案不在同乙個目錄下,如下圖結構所示,應該如何呼叫呢?project1 module1 function1.py test test.py如果test.py想要呼叫function1.py,可以使用絕對路徑。impor...

Python模組 跨目錄 呼叫總結

系統模組呼叫 說到模組呼叫,大家應該都對import有個基本的了解,在專案裡面非常常見的比如import time,from selenium import webdriver等,我們經常在python中通過from import import 的語法可以引用一些系統模組,把系統模組引入後就可以呼叫...