網站首頁 編程語言 正文
python運行或調用另一個py文件或參數
1. 運行另一個py文件
(1)在file_A.py中運行file_B.py文件
import os os.system("python file_B.py para_a1 para_a2") #其他形式 os.system("python file_B.py %s" % para_A) os.system("python file_B.py " + para_A)
需要注意文件路徑的寫法,因為我是在docker中運行文件,文件名前面需要加/,如os.system("python /file_B.py")
(2)file_B.py使用file_A.py傳遞的參數
import sys print(sys.argv) #由打印的結果可知,sys.argv[1:]是命令行傳遞的參數,sys.argv[0]是命令行運行的文件名 para_B = sys.argv[1]
2. 引用另一個py文件中的變量
from file_A import df_A
python調用自己寫的py文件
python如何調用自己寫的py文件呢?
同一個目錄下直接寫import xx就好了,xx為自己要調用的模塊名字,雖然會有下劃線報錯,其實,沒有錯,仍然可以調用,之前一直都被報錯嚇住了
如果是不同目錄怎么調用呢?
那就把需要調用的那個目錄添加一下,比如調用C:\xxx\a.py
那就添加一下c:\xxx路徑(windows的路徑和linux的路徑符號不同\\,/,注意區別)
然后import a就行了,前面寫r是為了告訴python這是路徑,別把\n等特殊組合給轉譯了,
如果同c:\xxx目錄下有多個文件,比如a.py,b.py等等,也可以直接導入了,因為這是告訴python去這個文件夾尋找包文件
import sys sys.path.append(r"C:\xxx") import a import b
如果需要調用的多個文件在多個目錄呢?
當然可以多次寫sys.path.append(r"C:\xxx")來添加多個目錄,
但是這樣很麻煩,如果文件距離很近,比如這樣就沒有必要寫
解決方法是添加一個空的__init__.py文件(用于定義包的屬性和方法,可以為空),表示這是一個包,比如這樣,聲明了aaa為一個包,a是內部的方法
也可以這樣,表示bbb是一個包,bb是bbb的子包,b是bb包的內部的方法
然后如果你需要調用a.py與b.py,就可以
testcode.py
import aaa.a import bbb.bb.b import ccc.c
如果你在c.py文件,想要調用a.py,b.py只需要用到步驟2的知識即可,比如
c.py
import sys #添加上級目錄 sys.path.append("..//") import aaa.a import bbb.bb.b
關于__init__.py的解釋
作用是將文件夾變為一個Python模塊,導入包時,事實上是導入了它的__init__.py文件
__init__.py 文件可以為空,但是也可以添加如下兩個功能
1.初始化包中各個模塊,批量導入
pack包,配置__init__.py
import a import b
導入pack包
訪問__init__.py文件中的引用文件,需要加上包名
import pack print(pack.a,pack.b)
2.__init__.py中的__all__,全部導入所聲明的模塊
此時導入pack包就相當于導入了a.py,b.py,c.py
pack包,配置__init__.py
__all__ = ['a', 'b', 'c']
調用
from pack import *
關于sys.path的解釋
當導入模塊時,解釋器按照sys.path列表中的目錄順序來查找文件。
print(sys.path)
會打印出一個list列表,表示引入文件時查找的文件目錄,第一個元素空字符表示當前目錄?
關于pyc與pyo文件
pyc就是py編譯時生成的字節碼文件,以后每次導入都會執行pyc,當py文件更新時pyc也會更新
如果解釋器添加-o命令,py編譯時會生成pyo文件,它相比pyc去掉了斷言(assert)、斷行號以及其他調試信息,運行速度更快
如果使用-OO選項,生成的pyo文件會忽略文檔信息
模塊導入時內部的原理
import可導入的對象可以是以下類型:
- 模塊文件(.py文件)
- C或C++擴展(已編譯為共享庫或DLL文件)
- 包(包含多個模塊)
- 內建模塊(使用C編寫并已鏈接到Python解釋器中)
- 理解為后綴就是.py、.pyo、.pyc、.pyd、.so、.dll
解釋器工作:
1.根據導入的文件名創建命名空間(用來訪問文件內部屬性與方法)
2.在命名空間內執行源代碼
3.創建一個源代碼文件的對象,這個對象引用對應的命名空間,管理模塊的內部函數與變量
4.一個模塊可以多次導入,但是后面導入的模塊只執行第三步
sys.modules可以打印出導入的模塊名與模塊對象的映射
因此可以理解導入文件的三種方式:
-
import a.b
:把a.b導入全局命名空間,想要調用c方法需要a.b.c -
from a import b
:把b導入全局命名空間,b.c -
from a.b import c
:把b的屬性c直接導入命名空間
原文鏈接:https://blog.csdn.net/SunseTor/article/details/108470991
相關推薦
- 2022-04-08 iOS實現計算器小功能_IOS
- 2022-06-13 Python數據類型及常用方法_python
- 2022-06-08 ASP.NET?Core中的靜態文件_基礎應用
- 2022-05-10 bean屬性xml方式的自動裝配
- 2022-04-11 jackson中對null的處理
- 2022-08-15 前端提交代碼時使用ESLint進行規范校驗報錯(Git husky > pre-commit(nod
- 2022-02-11 git clone報RPC failed; curl 18 transfer closed with
- 2022-07-16 MultipartFile與base64互轉
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支