1.簡介
os.exec*族主要用來代替當前進程,執行新的程序,不返回值。在UNIX上,新的執行程序加載到當前進程,與調用它的進程有相同的id。
(1)os.execl
(program,cmdarg1,cmdarg2,...cmdargN)
基本的'l'型exec,cmdarg1,cmdargN是一個或多個命令行參數,等價於os.execv(program,(cmdarg1,cmdarg2,...cmdargN))
os.
execle
(path, arg0, arg1, ..., env)
os.
execlp
(file, arg0, arg1, ...)
os.
execlpe
(file, arg0, arg1, ..., env)
(2)os.
execv
(program, commandlinesequence)
基本的'v'型exec,參數是可執行程序的名字,如‘c:/python.exe’,'D:/java.exe'等和用來運行程序用的命令參數組成的列表或者元組(也就是在shell中打的用於執行程序的參數,如 python test.py 100)
os.
execve
(path, args, env)
os.
execvp
(file, args)
os.
execvpe
(file, args, env)
需要說明的是:
‘l’和‘v'代表傳入命令行的參數設置情況,'l'代表固定個數的命令行參數,傳入時,分別以arg0,arg1...的形式,而’v'代表不定個數的命令行參數,傳入時,以args(列表或者元組)的形式。
p代表的是路徑,當無‘p'時,默認以可執行文件Python.exe的路徑傳入,如os.execl(r'C:\Software\python3.6.8\python.exe','python','child.py','k'),這里path就是C:\Software\python3.6.8/python.exe,有'p'時,以文件名python,傳入,該文件名默認自動從PATH環境變量中尋找,如os.execlp('python','pyton','child.py','k'),該處第一個'python',則是由系統環境變量(PATH)中Python對應的可執行文件。
e代表的是用來代表新進程環境變量的映射,采用字典的形式。
2.例子
在G:\PycharmProject\pythonScripts\testOsExe.py中寫入以下測試代碼:
import sys print('test...') print('sys.argv[1]-->',sys.argv[1])
os.execlp因為是‘l’型,所以命令行參數是分開的,得分開list的(大概是‘l’的含義),帶着p,說明第一個參數program,如果寫入'python'則可執行程序對應着系統環境變量Path中的‘python’的可執行程序路徑,即用默認python解釋器。而os.execl是'l'型,但沒帶'p',所以不會有上述帶'p'的映射關系,去找python解釋器,所以當第一個參數也是'python‘時,會報錯,顯然‘python’不是哪個可執行程序的路徑。但如果傳入sys.executable(返回解釋器位置),則正常運行。
import os args=r' -f rawvideo -video_size 640x360 -pixel_format gray -r 997 -i F:\FFmpeg\Video_DropTest_20200605180630784_w640_h360_pMono8_f997.raw -preset slow -crf 1 -c:v libx264 output.mp4' args=args.strip().split(' ') os.execlp(r'F:\FFmpeg\ffmpeg.exe','ffmpeg.exe',*args)
import os args=r'ffmpeg.exe -f rawvideo -video_size 640x360 -pixel_format gray -r 997 -i F:\FFmpeg\Video_DropTest_20200605180630784_w640_h360_pMono8_f997.raw -preset slow -crf 1 -c:v libx264 output.mp4' args=args.strip().split(' ') # os.execlp(r'F:\FFmpeg\ffmpeg.exe','ffmpeg.exe',*args) os.execvp(r'F:\FFmpeg\ffmpeg.exe',args)
對於os.execlp,os.execvp,中args中一定不能省略了'ffmpeg.exe'!