Estoy tratando de crear un programa que enumere y guarde todos los servicios en ejecución en mi máquina Windows en un archivo txt. Lo hice funcionar, pero no se enumera línea por línea como en mi salida en el shell de Python. Además, hay paréntesis añadidos que no quiero. Ver salida vs captura de pantalla del archivo txt a continuación. Además, mi código está debajo.

Salida vs archivo txt

Mi código hasta ahora:

import win32con
import win32service

#Define ListServices class
def ListServices():
    resume = 0
    accessSCM = win32con.GENERIC_READ
    accessSrv = win32service.SC_MANAGER_ALL_ACCESS

    #Open Service Control Manager
    hscm = win32service.OpenSCManager(None, None, accessSCM)

    #Enumerate Service Control Manager DB
    typeFilter = win32service.SERVICE_WIN32
    stateFilter = win32service.SERVICE_ACTIVE

    statuses = win32service.EnumServicesStatus(hscm, typeFilter, stateFilter)

    for (short_name, desc, status) in statuses:
        #Save output to txt file
        f=open('MyServices.txt', 'w')
        f.write(str(statuses))
        f.close()
        #Print output and append 'Running' at the end of each line
        print(desc, status, '----------> Running') 

ListServices();
1
WxRob87 15 sep. 2018 a las 19:29

4 respuestas

La mejor respuesta

write no agrega una nueva línea como lo hace print, por lo que debe encargarse usted mismo. Además, tenga en cuenta que no hay razón para abrir y cerrar el archivo en cada iteración. Solo déjalo abierto todo el tiempo que lo necesites:

with open('MyServices.txt', 'w') as f:
    for (short_name, desc, status) in statuses:
        f.write(str(statuses))
        f.write(os.linesep)
        #Print output and append 'Running' at the end of each line
        print(desc, status, '----------> Running') 
1
Mureinik 15 sep. 2018 a las 16:35

Debe agregar un carácter de nueva línea al final de su cadena, así:

f.write(str(statuses)+"\n")
0
bunbun 16 sep. 2018 a las 07:16

Gracias por toda su ayuda chicos!

Esto es lo que hizo el truco:

    with open('MyServices.txt', 'w') as f:
        for (short_name, desc, status) in statuses:
            f.write(str(desc))
            f.write(str(status))
            f.write('----------> Running')
            f.write(os.linesep)
            #Print output and append 'Running' at the end of each line
            print(desc, status, '----------> Running') 
1
WxRob87 15 sep. 2018 a las 16:57

Tienes algunos problemas aquí.

Primero, está sobrescribiendo su archivo MyServices.text cada vez en el ciclo. Por lo tanto, debe abrir su archivo fuera del ciclo.

En segundo lugar, está escribiendo la tupla statuses en su código. En su lugar, debe escribir la línea individual como lo hace en print

Tercero, f.write no agrega una nueva línea como lo hace print. Por lo tanto, debe agregar manualmente una nueva línea en su función de escritura.

# Open MyServices.txt outside loop so you don't overwrite the file on each iteration
with open('MyServices.txt', 'w') as f:    
    for (short_name, desc, status) in statuses:
         # Write each status line individually and manually add a newline to the output.
         f.write("{}, {}, {}\n".format(short_name, desc, status))
         print(desc, status, '----------> Running') 
0
Gohn67 15 sep. 2018 a las 16:58