python運行或調用另一個py文件或參數方式

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直接導入命名空間

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: