首頁 > 軟體

python執行或呼叫另一個py檔案或引數方式

2022-08-26 18:05:15

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:xxxa.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直接匯入名稱空間

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com