python编写的windows服务不能执行系统命令

我写了一个WINDOWS程序,监控IP的某个端口的连接情况,如果直接生成EXE是可以运行的,但是当我打包成了服务文件后,运行时却所“句柄无效”,后面一句一句的调试,发现是下面的这个库文件,运行subprocess.Popen时报错了,我把netstat 这个命令改成了其他的命令如:dir之类的,也同样报错,不清楚是不是在WINDOWS服务中不能使用subprocess.Popen或者有其他的原因????
望大侠帮助

下面是其中调用到的的一个库文件

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
阅读 3.4k
1 个回答

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

原来要这样处理,不会报错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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题