2013-02-16 141 views
0

在主代碼執行開始之前,我想檢查一個特定的端口是否打開,如果是,那麼關閉端口以便代碼可以「乾淨地」啓動。偵聽給定端口的程序

所以我在網上谷歌和這裏找到代碼: http://www.paulwhippconsulting.com.au/tips/63-finding-and-killing-processes-on-ports

但是從那裏只是粘貼代碼:

import os 
import subprocess 
import re 

ports = ['1234','5678','9101'] 


popen = subprocess.Popen(['netstat', '-lpn'], 
         shell=False, 
         stdout=subprocess.PIPE) 
(data, err) = popen.communicate() 

pattern = "^tcp.*((?:{0})).* (?P[0-9]*)/.*$" 
pattern = pattern.format(')|(?:'.join(ports)) 
prog = re.compile(pattern) #<---- error line 
for line in data.split('\n'): 
    match = re.match(prog, line) 
    if match: 
     pid = match.group('pid') 
     subprocess.Popen(['kill', '-9', pid]) 

但它拋出一個錯誤。

raise error, v # invalid expression 
sre_constants.error: unknown specifier: ?P[ 

回答

4

發佈該代碼段的人忘記了HTML - 轉義他的代碼!正確的代碼如下:

import os 
import subprocess 
import re 

ports = ['1234','5678','9101'] 


popen = subprocess.Popen(['netstat', '-lpn'], 
         shell=False, 
         stdout=subprocess.PIPE) 
(data, err) = popen.communicate() 

pattern = "^tcp.*((?:{0})).* (?P<pid>[0-9]*)/.*$" 
pattern = pattern.format(')|(?:'.join(ports)) 
prog = re.compile(pattern) 
for line in data.split('\n'): 
    match = re.match(prog, line) 
    if match: 
     pid = match.group('pid') 
     subprocess.Popen(['kill', '-9', pid]) 

注意<pid>遵循?P