python中模块、函数与各个模块之间的调用
1 針對一個模塊的函數調用
a : import 模塊名
模塊名.函數名
b: from 模塊名 import 函數名 (as 別名)
python調用另一個.py文件中的類和函數
同一文件夾下的調用
1.調用函數
A.py文件如下:
def add(x,y):
print(‘和為:%d’%(x+y))
在B.py文件中調用A.py的add函數如下:
import A
A.add(1,2)
或
from A import add
add(1,2)
2.調用類
A.py文件如下:
class A:def __init__(self,xx,yy):self.x=xxself.y=yydef add(self):print("x和y的和為:%d"%(self.x+self.y))在B.py文件中調用A.py的add函數如下:
from A import A a=A(2,3) a.add() 或 import A a=A.A(2,3) a.add()在不同文件夾下調用
A.py文件的文件路徑為:C:\AmyPython\Test1
B.py中調用A.py文件:
import sys sys.path.append(r'C:\AmyPython\Test1') #python import模塊時, 是在sys.path里按順序查找的。sys.path是一個列表,里面以字符串的形式存儲了許多路徑。使用A.py文件中的函數需要先將他的文件路徑放到sys.path中 import A a=A.A(2,3) a.add()https://blog.csdn.net/xiongchengluo1129/article/details/80453599?depth_1-
1、在Python中以相對路徑或者絕對路徑來導入文件或者模塊的方法
https://blog.csdn.net/xiongchengluo1129/article/details/80453599?depth_1-
?? 今天在調試代碼的時候,程序一直提示沒有該模塊,一直很納悶,因為我導入文件一直是用絕對路徑進行導入的。按道理來講是不會出現模塊找不到的情況的。
?? 最后仔細分析了整個代碼的目錄結構,才發現了問題。
下面依次來說明一下今天的情況
先看導入的代碼:
在demo——mnist.py文件中執行以下兩種導入操作 # 第一處 from gcforest.gcforest import GCForest from gcforest.utils.config_utils import load_json # 第二處 config = load_json("demo_mnist-ca.json") # 里面傳入的是文件的位置,這個函數是讀取配置文件的內容- 1
- 2
- 3
- 4
- 5
- 6
然后看一下目錄的結構
?? 在此例中,demo_mnist,py為主文件。它第一處要導入的是它當前目錄的父目錄下的一個子目錄中的一個目錄中的文件。
所以以絕對路徑導入這個文件就是 from lib.gcforest.gcforet import GCForest
以相對路徑導入這個文件就是 from ..gcforest.gcforet import GCForest
第二處導入的是它統一個目錄下的另一個文件,所以可以直接導入
所以修改的導入代碼為:config = load_json("demo_mnist-ca.json")
2、 順便復習一下相對路徑和絕對路徑的概念
? 絕對路徑就是文件的真正存在的路徑,是指從硬盤的根目錄(盤符)開始,進行一級級目錄指向文件。
?? 相對路徑就是以當前文件為基準進行一級級目錄指向被引用的資源文件。
?? ?以下是常用的表示當前目錄和當前目錄的父級目錄的標識符
??
../ 表示當前文件所在的目錄的上一級目錄
./ 表示當前文件所在的目錄(可以省略)
/ 表示當前站點的根目錄(域名映射的硬盤目錄)
在Python中可以驗證一下上述的標識方法:
測試的目錄結構:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
3、 再了解一下Python sys.path的使用
sys.path是python的搜索模塊的路徑集,是一個list,如下:
[ 'D:\\PycharmProjects\\mnistCheck', 'D:\\PycharmProjects\\mnistCheck', 'D:\\PycharmProjects\\KerasDataSettry', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\python35.zip', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\DLLs', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages', 'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\lib\\site-packages\\Sphinx-1.6.3-py3.5.egg' ]- 1
- 2
- 3
可以在python 環境下使用: .
?? sys.path.append(‘你的模塊的名稱’)。
?? sys.path.insert(0,’模塊的名稱’)
添加相關的路徑,但在退出python環境后自己添加的路徑就會自動消失!
代碼中的實現如下:
- 1
- 2
4、最后了解一下 python 在不同層級目錄import 模塊的方法(重點)
? 有一個文件夾/home/a, 里面有個模塊叫b.py, 我怎么把他import到程序里?
方法一: ?? (屬于剛開始分析的代碼里第一種情況)
import sys;
sys.path.append(“/home/a/”)
import b
方法二:
? 在目錄里面增加__init__.py文件,里面可以寫import時執行的代碼,當然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
? 前提 home、a中都包括__init__.py 即:要導入的文件的當前目錄和父目錄都要有init.py文件
? Python包含子目錄中的模塊方法比較簡單,關鍵是能夠在sys.path里面找到通向模塊文件的路徑。
下面將具體介紹幾種常用情況:
(1)主程序與模塊程序在同一目錄下:
如下面程序結構:
– src
? |– mod1.py
? |– test1.py
? 若在程序test1.py中導入模塊mod1, 則直接使用import mod1或from mod1 import *;
(2)主程序所在目錄是模塊所在目錄的父(或祖輩)目錄
如下面程序結構:
– src
|– mod1.py
|– mod2
? | – mod2.py
– test1.py
? 若在程序test1.py中導入模塊mod2, 需要在mod2文件夾中建立空文件__init__.py文件(也可以在該文件中自定義輸出模塊接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序導入上層目錄中模塊或其他目錄(平級)下的模塊
如下面程序結構:
– src
? |– mod1.py
? |– mod2
? ?|– mod2.py
? |– sub
? ? | – test2.py
? – test1.py
? 若在程序test2.py中導入模塊mod1.py和mod2.py。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立該文件。然后調用方式如下:
? 下面程序執行方式均在程序文件所在目錄下執行,如test2.py是在cd sub;之后執行python test2.py
而test1.py是在cd src;之后執行python test1.py; 不保證在src目錄下執行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2
(4)從(3)可以看出,導入模塊關鍵是能夠根據sys.path環境變量的值,找到具體模塊的路徑。這里僅介紹上面三種簡單情況。
總結:
? 通過總結可以發現,當你要導入的文件在和你的當前文件在同一個目錄時,你直接導入這個文件名就好了。
? 當你要導入的文件或者目錄不和你的當前文件同目錄時,你需要跳到這個你要導入文件的父級目錄,然后一級一級的用點號連接走過的目錄或者文件,然后就可以了 至于要怎么跳到這個這個父級目錄。比較通用的就是,將父級目錄加入系統路徑,然后用點號一級一級的尋找,直到到達你要導入的模塊。
總結
以上是生活随笔為你收集整理的python中模块、函数与各个模块之间的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 | 利用Lattice LST
- 下一篇: RuntimeError: Failed