鍍金池/ 問答/Python  Office/ python編寫的windows服務(wù)不能執(zhí)行系統(tǒng)命令

python編寫的windows服務(wù)不能執(zhí)行系統(tǒng)命令

我寫了一個(gè)WINDOWS程序,監(jiān)控IP的某個(gè)端口的連接情況,如果直接生成EXE是可以運(yùn)行的,但是當(dāng)我打包成了服務(wù)文件后,運(yùn)行時(shí)卻所“句柄無效”,后面一句一句的調(diào)試,發(fā)現(xiàn)是下面的這個(gè)庫文件,運(yùn)行subprocess.Popen時(shí)報(bào)錯(cuò)了,我把netstat 這個(gè)命令改成了其他的命令如:dir之類的,也同樣報(bào)錯(cuò),不清楚是不是在WINDOWS服務(wù)中不能使用subprocess.Popen或者有其他的原因????
望大俠幫助

下面是其中調(diào)用到的的一個(gè)庫文件

import subprocess
from Action.SYS.get import *
class System:
    __get=None
    __OS=''
    def __init__(self):
        self.__get=get()
        self.__OS=self.__get.getOS()

    def serverListenByPort(self,address, port, netstatus="ESTABLISHED"):
        result = []
        statuspos=0
        if self.__OS=='Linux':
            subp = subprocess.Popen('netstat -ano | grep %s:%s' % (address, port), shell=True, stdout=subprocess.PIPE)
            statuspos=5
        if self.__OS=='Windows':
            subp = subprocess.Popen('netstat -ano | findstr %s:%s' % (address, port), shell=True, stdout=subprocess.PIPE)
            statuspos = 3
        while True:
            buff = subp.stdout.readline()
            buff = str(buff, encoding='utf-8')
            buffers = buff.split()
            try:
                if str(buffers[statuspos]).strip() == netstatus:
                    buffers.append(self.__OS)
                    result.append(buffers)
            except Exception as e:
                pass
            if buff == '' or buff == None:
                break;
        return result
回答
編輯回答
清夢(mèng)

proc = subprocess.Popen(args,shell=True,stdout=open(outimploc, 'w'), stderr=open(outimplocerr,'w'),stdin = subprocess.PIPE, cwd=self.tranusConf.workingDirectory).communicate()

原來要這樣處理,不會(huì)報(bào)錯(cuò)winerror 6

import subprocess
from Action.SYS.get import *
from Action.SYS.Log import *
from Action.File.FileEvent import *
import os
class System:
    __get=None
    __OS=''
    __file=None
    def __init__(self):
        self.__get=get()
        self.__OS=self.__get.getOS()
        self.__file=FileEvent()

    def serverListenByPort(self,address, port, netstatus="ESTABLISHED"):
        result = []
        statuspos=0
        if self.__OS=='Linux':
            subp = subprocess.Popen('netstat -ano | grep %s:%s' % (address, port),  stdout=subprocess.PIPE)
            statuspos=5
            while True:
                buff = subp.stdout.readline()
                buff = str(buff, encoding='utf-8')
                buffers = buff.split()
                try:
                    if str(buffers[statuspos]).strip() == netstatus:
                        buffers.append(self.__OS)
                        result.append(buffers)
                except Exception as e:
                    pass
                if buff == '' or buff == None:
                    break;
        if self.__OS=='Windows':
            try:
                outimploc = self.__file.get_dir() + '/out.txt';
                outimplocerr = self.__file.get_dir() + '/error.txt';
                tranusConf = self.__file.get_dir()
                subp = subprocess.Popen('netstat -ano', stdout=open(outimploc, 'w'), stderr=open(outimplocerr, 'w'),stdin=subprocess.PIPE, cwd=tranusConf).communicate()
                statuspos = 3
                try:
                    f = open(outimploc, 'r')
                    while True:
                        line=''
                        try:
                            line = f.readline()
                            linsplit = str(line).strip().split()
                            if linsplit[1].strip() == '%s:%s' % (str(address).strip(),str(port).strip()):
                                if linsplit[3].strip()==netstatus:
                                    linsplit.append(self.__OS)
                                    result.append(linsplit)
                        except Exception as e:
                            Log.log('error', str(e))
                        if line == '' or line == None:
                            break;
                    f.close()
                except Exception as e:
                    Log.log('error', str(e))
            except Exception as e:
                Log.log('error',str(e))
        return result
2017年6月30日 20:17