python調用外部程序
⑴ python中3種調用可執行文件.exe的方法
方法一、os.system() 會保存可執行程序中的列印值和主函數的返回值,且會將執行過程中要列印的內容列印出來。
import os
main = "project1.exe"
r_v = os.system(main)
print (r_v )
方法二、commands.getstatusoutput() 會保存可執行程序中的列印值和主函數的返回值,但不會將執行過程中要列印的內容列印出來。
import subprocess
import os
main = "project1.exe"
if os.path.exists(main):
rc,out= subprocess.getstatusoutput(main)
print (rc)
print ('*'*10)
print (out)
方法三、popen() 會保存可執行程序中的列印值,但不會保存主函數的返回值,也但不會將執行過程中要列印的內容列印出來。
import os
main = "project1.exe"
f = os.popen(main)
data = f.readlines()
f.close()
print (data)
另外,上面提到的三種方式,實際上都是在python中執行命令,因此他們不只是用來執行可執行文件,也可以用來執行linux系統中別的指令。
關於python中3種調用可執行文件.exe的方法,環球青藤小編就和大家分享到這里了,學習是永無止境的,學習一項技能更是受益終身,所以,只要肯努力學,什麼時候開始都不晚。如果您還想繼續了解關於python編程的學習方法及素材等內容,可以點擊本站其他文章學習。
⑵ Python Popen communicate 和wait使用上的區別
單說就是,使用subprocess模塊的Popen調用外部程序,如果stdout或stderr參數是 pipe,並且程序輸出超過操作系統的 pipe size時,如果使用Popen.wait()方式等待程序結束獲取返回值,會導致死鎖,程序卡在wait()調用上。
ulimit -a看到的 pipe size 是 4KB,那隻是每頁的大小,查詢得知 linux 默認的pipe size 是 64KB。
看例子:
#!/usr/bin/env python
# coding: utf-8
# yc@2013/04/28
import subprocess
def test(size):
print 'start'
cmd = 'dd if=/dev/urandom bs=1 count=%d 2>/dev/null' % size
p = subprocess.Popen(args=cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
#p.communicate()
p.wait()
print 'end'
# 64KB
test(64 * 1024)
# 64KB + 1B
test(64 * 1024 + 1)
首先測試輸出為 64KB 大小的情況。使用 dd 產生了正好 64KB 的標准輸出,由subprocess.Popen調用,然後使用wait()等待dd調用結束。可以看到正確的start和end輸出;然後測試比 64KB 多的情況,這種情況下只輸出了start,也就是說程序執行卡在了p.wait()上,程序死鎖。具體輸出如下:
start
end
start
那死鎖問題如何避免呢?官方文檔里推薦使用Popen.communicate()。這個方法會把輸出放在內存,而不是管道里,所以這時候上限就和內存大小有關了,一般不會有問題。而且如果要獲得程序返回值,可以在調用Popen.communicate()之後取Popen.returncode的值。
結論:如果使用subprocess.Popen,就不使用Popen.wait(),而使用Popen.communicate()來等待外部程序執行結束。
Popen.wait()¶
Wait for child process to terminate. Set and returnreturncodeattribute.
Warning
This will deadlock when usingstdout=PIPEand/orstderr=PIPEand the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Usecommunicate()to avoid that.
subprocess 的兩種方法:
1)如果想調用之後直接阻塞到子程序調用結束:
Depending on how you want to work your script you have two options. If you want the commands to block and not do anything while it is executing, you can just usesubprocess.call.
#start and block until donesubprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])
2)非阻塞的時候方式:If you want to do things while it is executing or feed things intostdin, you can usecommunicateafter thepopencall.
#start and process things, then waitp = subprocess.Popen(([data["om_points"], ">", diz['d']+"/points.xml"])print "Happens while running"p.communicate() #now waitAs stated in the documentation,waitcan deadlock, so communicate is advisable.
Popen.communicate(input=None)¶
Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optionalinputargument should be a string to be sent to the child process, orNone, if no data should be sent to the child.
communicate()returns a tuple(stdoutdata,stderrdata).
Note that if you want to send data to the process』s stdin, you need to create the Popen object withstdin=PIPE. Similarly, to get anything other thanNonein the result tuple, you need to givestdout=PIPEand/orstderr=PIPEtoo.
Note
The data read is buffered in memory, so do not use this method if the data size is large or unlimited.
⑶ 在vs上怎麼用python將一個程序引入另一個程序
python中調用另一個程序有多種不同方式,一種是調用本文件下的某個函數來實現調用,另一種是調用模塊或包文件下的函數實現調用,還有一種是通過類方法的方式調用類定義的某段程序。
自身函數的調用時相當方便的,在定義好了函數以後直接按定義的格式調用即可,出現的錯誤為參數數量不匹配。通過包或模塊調用相對自身函數調用比較復雜,需要提前導入包或模塊,常用的方法為import或者fromimport,導入成功的前提是對應的包或模塊在python路徑之下,可以通過sys.path(sys為系統內置模塊可以直接使用importsys導入)來查看python路徑。以導入第三方包文件requests為例。通過類方法的調用需要在調用之前,實例化一個類對象,通過這個類對象來調用類方法,注意第三個方法為私有方法,不允許類外部訪問。
⑷ 利用python對外部程序進行操作
代碼如下 復制代碼
object_id_list=[1, 3, 88, 99]
f=open(『mylist』, 「w」)
for id in object_id_list:
f.writelines(str(id))
f.close() #只有輸入這一句之後才會真正寫入到文件中
cat mylist
138899% # 最後有一個%表示沒有換行
>>> object_id_list=[1, 3, 88, 99]
>>> f=open(『mylist』, 「w」)
>>> for id in object_id_list:
… f.writelines(str(id) + 『\n』)
…
>>> f.close()
➜ ~ cat mylist
1
3
88
99
例子2
代碼如下 復制代碼
def processFile(inputFile, outputFile): #定義一個函數
fin = open(inputFile, 'r') #以讀的方式打開文件
fout = open(outputFile, 'w') #以寫得方式打開文件
for eachLine in fin: #讀取文件的每一行
line = eachLine.strip().decode('utf-8', 'ignore') #去除每行的首位空格,並且將文件編碼轉換成Unicode編碼
outStr = line #我沒對讀入的文本進行處理,只是直接將其輸出到文件
fout.write(outStr.strip().encode('utf-8') + 'n') #去除首位的空格,並轉回到utf-8編碼,然後輸出
fin.close() #關閉文件
fout.close()
processFile('myinputFile.txt', 'myoutputFile.txt') #調用該函數對文件進行處理
注意:1、由於Python能夠很方便的對Unicode編碼進行處理,所以最好先轉換成Unicode編程進行處理;
2、由於讀入文本後進行處理,可能會在文本末尾加上空格,所以寫入文件的時候,最好先用strip()函數清除一下首位的空格;
我使用的是Linux環境,程序寫完之後,輸入:python test.py 就能執行該程序了。
讀文件
讀文本文件
input = open('data', 'r')
#第二個參數默認為r
input = open('data')
讀二進制文件
input = open('data', 'rb')
讀取所有內容
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
讀固定位元組
file_object = open('abinfile', 'rb')
try:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )
讀每行
list_of_all_the_lines = file_object.readlines( )
如果文件是文本文件,還可以直接遍歷文件對象獲取每行:
for line in file_object:
process line
3.寫文件
寫文本文件
output = open('data', 'w')
寫二進制文件
output = open('data', 'wb')
追加寫文件
output = open('data', 'w+')
寫數據
file_object = open('thefile.txt', 'w')
file_object.write(all_the_text)
file_object.close( )
寫入多行
file_object.writelines(list_of_text_strings)
注意,調用writelines寫入多行在性能上會比使用write一次性寫入要高。
在處理日誌文件的時候,常常會遇到這樣的情況:日誌文件巨大,不可能一次性把整個文件讀入到內存中進行處理,例如需要在一台物理內存為 2GB 的機器上處理一個 2GB 的日誌文件,我們可能希望每次只處理其中 200MB 的內容。
在 Python 中,內置的 File 對象直接提供了一個 readlines(sizehint) 函數來完成這樣的事情。以下面的代碼為例:
file = open('test.log', 'r')sizehint = 209715200 # 200Mposition = 0lines = file.readlines(sizehint)while not file.tell() - position < 0: position = file.tell() lines = file.readlines(sizehint)
每次調用 readlines(sizehint) 函數,會返回大約 200MB 的數據,而且所返回的必然都是完整的行數據,大多數情況下,返回的數據的位元組數會稍微比 sizehint 指定的值大一點(除最後一次調用 readlines(sizehint) 函數的時候)。通常情況下,Python 會自動將用戶指定的 sizehint 的值調整成內部緩存大小的整數倍。
file在python是一個特殊的類型,它用於在python程序中對外部的文件進行操作。在python中一切都是對象,file也不例外,file有file的方法和屬性。下面先來看如何創建一個file對象:
file(name[, mode[, buffering]])
file()函數用於創建一個file對象,它有一個別名叫open(),可能更形象一些,它們是內置函數。來看看它的參數。它參數都是以字元串的形式傳遞的。name是文件的名字。
mode是打開的模式,可選的值為r w a U,分別代表讀(默認) 寫 添加支持各種換行符的模式。用w或a模式打開文件的話,如果文件不存在,那麼就自動創建。此外,用w模式打開一個已經存在的文件時,原有文件的內容會被清空,因為一開始文件的操作的標記是在文件的開頭的,這時候進行寫操作,無疑會把原有的內容給抹掉。由於歷史的原因,換行符在不同的系統中有不同模式,比如在 unix中是一個n,而在windows中是『rn』,用U模式打開文件,就是支持所有的換行模式,也就說『r』 'n' 'rn'都可表示換行,會有一個tuple用來存貯這個文件中用到過的換行符。不過,雖說換行有多種模式,讀到python中統一用n代替。在模式字元的後面,還可以加上+ b t這兩種標識,分別表示可以對文件同時進行讀寫操作和用二進制模式、文本模式(默認)打開文件。
buffering如果為0表示不進行緩沖;如果為1表示進行「行緩沖「;如果是一個大於1的數表示緩沖區的大小,應該是以位元組為單位的。
file對象有自己的屬性和方法。先來看看file的屬性。
closed #標記文件是否已經關閉,由close()改寫
encoding #文件編碼
mode #打開模式
name #文件名
newlines #文件中用到的換行模式,是一個tuple
softspace #boolean型,一般為0,據說用於print
file的讀寫方法:
F.read([size]) #size為讀取的長度,以byte為單位
F.readline([size])
#讀一行,如果定義了size,有可能返回的只是一行的一部分
F.readlines([size])
#把文件每一行作為一個list的一個成員,並返回這個list。其實它的內部是通過循環調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分。
F.write(str)
#把str寫到文件中,write()並不會在str後加上一個換行符
F.writelines(seq)
#把seq的內容全部寫到文件中。這個函數也只是忠實地寫入,不會在每行後面加上任何東西。
file的其他方法:
F.close()
#關閉文件。python會在一個文件不用後自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個文件在關閉後還對其進行操作會產生ValueError
F.flush()
#把緩沖區的內容寫入硬碟
F.fileno()
#返回一個長整型的」文件標簽「
F.isatty()
#文件是否是一個終端設備文件(unix系統中的)
F.tell()
#返迴文件操作標記的當前位置,以文件的開頭為原點
F.next()
#返回下一行,並將文件操作標記位移到下一行。把一個file用於for ... in file這樣的語句時,就是調用next()函數來實現遍歷的。
F.seek(offset[,whence])
#將文件打操作標記移到offset的位置。這個offset一般是相對於文件的開頭來計算的,一般為正數。但如果提供了whence參數就不一定了,whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。需要注意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾。
F.truncate([size])
#把文件裁成規定的大小,默認的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。