Python跨文件調(diào)用函數(shù)以及在一個文件中執(zhí)行另一個文件
一、項目簡介
假如現(xiàn)在有這樣一個文件樹(從其他地方copy的,稍加整改)
A
|-------- __init__.py
|-------- a.py
|-------- main.py
|-------- B
|-------- __init__.py
|-------- b.py
|-------- C
|-------- __init__.py
|-------- c.py
文件內(nèi)容如下:
# a.py
def a_hello():
print("A_HELLO")
----------------------------
# b.py
def b_hello():
print("B_HELLO")
----------------------------
# c.py
def c_hello():
print("C_HELLO")
----------------------------
# main.py
def main_hello():
print("MAIN_HELLO")
為什么要有
__init__.py文件呢?
【答】在Python工程里,當python檢測到一個目錄下存在__init__.py文件時,python就會把它當成一個模塊(module)。Module跟C++的命名空間和Java的Package的概念很像,都是為了科學地組織化工程,管理命名空間。__init__.py可以是一個空文件,也可以有非常豐富的內(nèi)容。
二、調(diào)用類型
1、調(diào)用同文件中的函數(shù)
這個比較簡單,比如我想在main.py中調(diào)用main_hello()函數(shù),那么我直接main_hello()即可
2、調(diào)用同目錄下不同文件中的函數(shù)
比如我想在main.py中調(diào)用a.py中的a_hello()函數(shù),可做如下操作
import a a.a_hello()
3、調(diào)用同級文件夾文件中的函數(shù)
比如我想在main.py中調(diào)用文件夾B下b.py中的b_hello()函數(shù),可做如下操作:
from B import b b.b_hello()
4、調(diào)用上一級文件夾文件中的函數(shù)
比如我想在c.py中調(diào)用a.py中的函數(shù),這時候如果用上面的方法就會報錯No module named xx。解決方法就是將目錄A加到系統(tǒng)路徑下
import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
注意,sys.path添加目錄時注意是在windows還是在linux下,windows下需要用\\,linux下需要用/否則會出錯。這樣需要區(qū)分操作系統(tǒng),而且需要知道絕對路徑,豈不是很不好用??吹接写罄杏玫竭^如下操作:
import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
上面這句話很長,但也不難理解,os.path.dirname(__file__)獲取當前文件的絕對路徑,os.path.join(xx,'..')在后面追加..,相當于進入上一級目錄,然后再os.path.abspath(xx)獲取絕對路徑,最后sys.path.append()將其加入系統(tǒng)路徑當中。經(jīng)過這些操作之后,被加入系統(tǒng)路徑中的所有文件中的函數(shù)都可以被調(diào)用了。
5、調(diào)用上一級文件夾子文件夾下文件中的函數(shù)
后面有朋友問了,所以這里再補充一下 2022-09-23
因為原來的項目被我刪了,這里我并沒有做測試啊,一般我都是這么用的,應該無問題。
比如我想在c.py中調(diào)用b.py中的函數(shù),那么c.py的import為
import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import B.b as b b.b_hello()
6、執(zhí)行另一個文件
import os os.system(r'python tmp.py') # 最好給文件的絕對路徑,否則有可能會找不到文件。
三、概念區(qū)分
- Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和 Python 語句。
- Python 包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環(huán)境。簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內(nèi)容可以為空。__init__.py 用于標識當前文件夾是一個包。
- 文件夾:文件夾就是不存在 __init__.py 文件的文件夾。
另外,對于導入模塊可以使用import model1或from model1 import func1, func2, ...。其實,這兩種方式看似一樣,但是是有所區(qū)別的,具體請看
總結
到此這篇關于Python跨文件調(diào)用函數(shù)以及在一個文件中執(zhí)行另一個文件的文章就介紹到這了,更多相關Python跨文件調(diào)用函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python和Anaconda和Pycharm安裝教程圖文詳解
PyCharm是一種PythonIDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,這篇文章主要介紹了Python和Anaconda和Pycharm安裝教程,需要的朋友可以參考下2020-02-02
Python+Scipy實現(xiàn)自定義任意的概率分布
Scipy自帶了多種常見的分布,如正態(tài)分布、均勻分布、二項分布、多項分布、伽馬分布等等,還可以自定義任意的概率分布。本文將為大家介紹如何利用Scipy自定義任意的概率分布,感興趣的可以了解下2022-08-08

