我眼中的subprocess

2021-09-10 07:54:13 字數 3657 閱讀 4047

總結

但是遺憾的是這個」遠端操作「功能成為了瓶頸,其實就是怎麼讓當前程序去執行額外命令。 還好遇到了subprocess。然後就可以很方便的」為所欲為「啦。

也許在subprocess之前,你可能聽說過os模組。如:

import oscmdstr = "some cmd command"

os.system(cmdstr)

這種方式可以很輕鬆的執行windows上的命令,但是缺點是:

不受控,沒有返回結果。對於簡單的需求而言還行,但是對於需要獲取返回結果的就不太適用了。

相比較subprocess, 執行一條命令就方便多了。比如實現與os模組相同功能的話,可以使用如下**:

import subprocesscmdstr = "some cmd command"subprocess.call(cmdstr)
當你想執行帶有命令列引數的命令的時候,也是比較方便的。可以使用乙個列表盛放需要執行的命令。subprocess底層會預設將這個列表拼裝成命令字串。

import subprocesscmdstr1 = 'ping'cmdstr2 = 'www.douban.com'subprocess.call([cmdstr1, cmdstr2])
除此之外,還有

-subprocess.check_call()

等函式。按需選取就行了。

熟悉命令列的同行肯定對於管道|不陌生了。工作在程序之間,為操作的提供了巨大的便利。尤其是linux愛好者,管道的魅力更甚。

當然了,windows上也是支援的,比方說,找出膝上型電腦上網絡卡網段為192.開頭的資訊。就可以這樣辦。

同樣,在subprocess中,pipe的原理也是一樣的。如果需要讓管道起作用的話,popen內相關引數要設定為pipe即可。這一點可以參照文件,這裡不再敘述。

典型的場景就是,父程序內開啟乙個子程序,並獲取子程序的執行的返回結果。

這個時候,就需要指定stdin, stdout為pipe形式了。否則的話,兩個程序之間是無法進行交流的。這就好比兩個池塘,相互有自己的資源,如果內有乙個通道的話,兩個池塘就沒辦法」交流「。

1.py

import syss = "this is from {}".format(__file__)sys.stdout.write(s)
2.py
import subprocessimport systry:    child = subprocess.popen('python ./1.py', stdout=subprocess.pipe,stdin=subprocess.pipe,stderr=subprocess.pipe)    print child.stdout.readline()except exception as e:    print e
執行結果

如上,不難看出。父程序2.py最終得到了子程序1.py的執行結果的。

雖然這個很明顯是單向的」交流「,但是已經滿足博主的需求了。這就好比士兵對於命令的服從,給出指令,儘管執行便是,最後把結果反饋回來即可。

但是如果非要雙向交流的話,那就得借助於communicate()方法了。

(^__^) 嘻嘻……

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

總結 但是遺憾的是這個」遠端操作「功能成為了瓶頸,其實就是怎麼讓當前程序去執行額外命令。 還好遇到了subprocess。然後就可以很方便的」為所欲為「啦。

也許在subprocess之前,你可能聽說過os模組。如:

import oscmdstr = "some cmd command"

os.system(cmdstr)

這種方式可以很輕鬆的執行windows上的命令,但是缺點是:

不受控,沒有返回結果。對於簡單的需求而言還行,但是對於需要獲取返回結果的就不太適用了。

相比較subprocess, 執行一條命令就方便多了。比如實現與os模組相同功能的話,可以使用如下**:

import subprocesscmdstr = "some cmd command"subprocess.call(cmdstr)
當你想執行帶有命令列引數的命令的時候,也是比較方便的。可以使用乙個列表盛放需要執行的命令。subprocess底層會預設將這個列表拼裝成命令字串。

import subprocesscmdstr1 = 'ping'cmdstr2 = 'www.douban.com'subprocess.call([cmdstr1, cmdstr2])
除此之外,還有

-subprocess.check_call()

等函式。按需選取就行了。

熟悉命令列的同行肯定對於管道|不陌生了。工作在程序之間,為操作的提供了巨大的便利。尤其是linux愛好者,管道的魅力更甚。

當然了,windows上也是支援的,比方說,找出膝上型電腦上網絡卡網段為192.開頭的資訊。就可以這樣辦。

同樣,在subprocess中,pipe的原理也是一樣的。如果需要讓管道起作用的話,popen內相關引數要設定為pipe即可。這一點可以參照文件,這裡不再敘述。

典型的場景就是,父程序內開啟乙個子程序,並獲取子程序的執行的返回結果。

這個時候,就需要指定stdin, stdout為pipe形式了。否則的話,兩個程序之間是無法進行交流的。這就好比兩個池塘,相互有自己的資源,如果內有乙個通道的話,兩個池塘就沒辦法」交流「。

1.py

import syss = "this is from {}".format(__file__)sys.stdout.write(s)
2.py
import subprocessimport systry:    child = subprocess.popen('python ./1.py', stdout=subprocess.pipe,stdin=subprocess.pipe,stderr=subprocess.pipe)    print child.stdout.readline()except exception as e:    print e
執行結果

如上,不難看出。父程序2.py最終得到了子程序1.py的執行結果的。

雖然這個很明顯是單向的」交流「,但是已經滿足博主的需求了。這就好比士兵對於命令的服從,給出指令,儘管執行便是,最後把結果反饋回來即可。

但是如果非要雙向交流的話,那就得借助於communicate()方法了。

(^__^) 嘻嘻……

我,眼中的詩歌

我,眼中的詩歌 給我一杯茶,乙個幽靜的地方,我好看些詩歌。寫前面 詩歌是一種態度。詩歌是燕子低低地飛過屋簷。詩歌是古代西方 盛行的決鬥。詩歌是人類本身一直都存在的 極為樸素的一種本能。詩歌和性別無關 和身材無關,和你曾看過多少書也沒有直接的 聯絡,造物主將嘴巴賦予人類的同時 也賦予了人類詩歌。詩歌是...

我眼中的委託

首先委託是乙個型別,和int string一樣,我們日常說的委託其實是委託型別的變數,委託的作用就是把方法當成引數來傳遞,將方法賦值給委託型別的變數,然後由這個變數去呼叫執行方法。換個方式,委託沒有具體實現體,因為委託就是叫別人去辦事,自己當然不需要實現了,但是委託別人必須要清楚自己想辦什麼事,這個...

我眼中的Spring MVC

spring mvc 是應用於web應用程式 mvc架構的 c 首先說一下spring mvc框架文件中的一句話 對擴充套件開放 對修改閉合 那麼特點就來了 高擴充套件性 這是它最大的特點還有 友好的設計的結構,思想,引數繫結,允許其他mvc的實現等等 總的來就是簡單易用 在這裡只是簡單介紹一下有哪...