2017-05-16 5 views
2

과 마찬가지로 Taskmanager UI에 표시되는 tasklist 명령을 찾으려고합니다. 파이썬에서 실행하려고 시도하고 있습니다. 그럴 가능성이없는 경우 해당하는 python 명령이 있습니다. 설명이있는 모든 작업 목록? 당신이 상상할 수 있으며 당신이 정말로 그것을 정당화하기 위해 모든 문제를 통해 갈 수있는 좋은 이유가 필요한 것보다 조금 복잡합니다설명이있는 작업리스트 명령

tasklist /? 
+0

어떤 종류의 작업에 대해 말하고 있습니까? OS와 관련이 있다면 ... 어떤 OS를 사용하고 있습니까? 이 질문은 지금과 같이 대답 할 수 없습니다 ... –

+0

@RiccardoPetraglia - 저는 Windows7,10에 대해 말하고 있습니다 .... 그 컴퓨터에서 실행중인 모든 프로세스를 의미하는 작업 – user3508811

+0

이것은 중요한 세부 사항처럼 보입니다 ...;) –

답변

1

. Description 필드에 도착, 그러나

import csv 
import subprocess 

try: 
    tl_out = subprocess.check_output(["tasklist", "/fo", "csv", "/v"]) 
except subprocess.CalledProcessError as e: 
    print("Call to `tasklist` failed: {}".format(e)) 
    exit(1) 

tl_csv = csv.DictReader(tl_out.splitlines()) 
for row in tl_csv: 
    print(row) # prints a dict for each task with all available fields 
    # Available fields (may vary from platform to platform) are: 
    # 'Status', 'CPU Time', 'Image Name', 'Session Name', 'Window Title', 
    # 'PID', 'User Name', 'Session#', 'Mem Usage' 

(그리고 작업 관리자 UI에서 많은 다른 사람) : 당신은 아주 가까이에 얻을 수 있지만 먼저, 작업 관리자 UI는 tasklist.exe로부터 정보를 얻을하지 않습니다 적어도 WMI에서 데이터를 가져와야합니다. 더욱 복잡한 최대 이식성 등 모든 것이 우리가 list 형식을 사용하고 그것을 자신을 구문 분석 할 필요가 만드는 Windows 7 has a bug when exporting to CSV에, 설상가상 WMIC를 만들려면 :

import subprocess 

try: 
    wmi_out = subprocess.check_output(["wmic", "process", "list", "full", "/format:list"]) 
except subprocess.CalledProcessError as e: 
    print("Call to `wmic` failed: {}".format(e)) 
    exit(1) 

# parse the WMI list: 
wmi_entries = [] 
for task in wmi_out.strip().split("\r\r\n\r\r\n"): 
    wmi_entries.append(dict(e.split("=", 1) for e in task.strip().split("\r\r\n"))) 

for row in wmi_entries: 
    print(row) # prints a dict for each task with all available fields 
    # Available fields (may vary from platform to platform) are: 
    # 'CSName', 'CommandLine', 'Description', 'ExecutablePath', 'ExecutionState', 'Handle', 
    # 'HandleCount', 'InstallDate', 'KernelModeTime', 'MaximumWorkingSetSize', 
    # 'MinimumWorkingSetSize', 'Name', 'OSName', 'OtherOperationCount', 'OtherTransferCount', 
    # 'PageFaults', 'PageFileUsage', 'ParentProcessId', 'PeakPageFileUsage', 
    # 'PeakVirtualSize', 'PeakWorkingSetSize', 'Priority', 'PrivatePageCount', 'ProcessId', 
    # 'QuotaNonPagedPoolUsage', 'QuotaPagedPoolUsage', 'QuotaPeakNonPagedPoolUsage', 
    # 'QuotaPeakPagedPoolUsage', 'ReadOperationCount', 'ReadTransferCount', 'SessionId', 
    # 'Status', 'TerminationDate', 'ThreadCount', 'UserModeTime', 'VirtualSize', 
    # 'WindowsVersion', 'WorkingSetSize', 'WriteOperationCount', 'WriteTransferCount' 

이 모든 필드가 필요하지 않은 경우, 당신이 할 수있는 원하는 필드를 얻으려면 항상 wmic을 제한하십시오 (즉, wmi_out = subprocess.check_output(["wmic", "process", "get", "ProcessId,ExecutablePath,Description", "/format:list"])Description/ProcessId).

하지만 문제가 끝났다고 생각하지 마십시오. 방금 시작했습니다. Description 필드 (및 부팅 할 다른 몇 가지 필드)가 있지만 설명이없는 프로세스 (대부분은 Windows 프로그래머가 게으른 것처럼 보임) 또는 설명없이 서비스가 있음을 알 수 있습니다. 설명 값은 실행 파일 이름이 들어 있습니다. 예를 들어 평범한 오래된 메모장을 실행하는 경우 작업 관리자 UI에서 설명으로 Notepad을 표시하지만 해당 사전 항목은 notepad.exe입니다. 이는 작업 관리자 UI가 작업 목록에 완전히 다른 접근 방식을 사용하고 설명을 가져 오기 때문입니다 프로세스 실행 파일에서 직접.

실제 리소스 테이블에서 직접 실행 가능한 설명을 검색하려면 추가 단계가 필요합니다. Win32 API를 호출하여 설명을 가져 오는 것이 가장 쉽기 때문에 pyWin32 모듈을 설치해야합니다. 먼저 :

import subprocess 
import win32api 

# gets executable description via W32API 
def get_executable_desc(path, default=''): 
    try: 
     language, codepage = win32api.GetFileVersionInfo(path, "\\VarFileInfo\\Translation")[0] 
     return win32api.GetFileVersionInfo(path, "\\StringFileInfo\\{:04x}{:04x}\\FileDescription".format(language, codepage)) or default 
    except: 
     return default 

try: 
    wmi_out = subprocess.check_output(["wmic", "process", "list", "full", "/format:list"]) 
except subprocess.CalledProcessError as e: 
    print("Call to `tasklist` failed: {}".format(e)) 
    exit(1) 

# parse the WMI list: 
wmi_entries = [] 
for task in wmi_out.strip().split("\r\r\n\r\r\n"): 
    entry = dict(e.split("=", 1) for e in task.strip().split("\r\r\n")) 
    entry['Description'] = get_executable_desc(entry.get("ExecutablePath", None), entry.get("Description", None)) 
    wmi_entries.append(entry) 

for row in wmi_entries: 
    print(row) # prints a dict for each task with all available fields 

Voilà! 설명이 이제 채워집니다 (사용 가능한 경우 또는 적어도 실행 파일 이름 보유). 그러나 설명에 도달하기 위해 Win32 API를 사용해야했기 때문에 더 빠르고 간결한 작업 목록을 얻을 수 있습니다.

from win32api import GetFileVersionInfo, OpenProcess 
from win32con import PROCESS_QUERY_INFORMATION, PROCESS_VM_READ 
from win32process import EnumProcesses, EnumProcessModules, GetModuleFileNameEx 
import pywintypes 

# gets executable description via W32API 
def get_executable_desc(path, default=''): 
    try: 
     language, codepage = GetFileVersionInfo(path, "\\VarFileInfo\\Translation")[0] 
     return GetFileVersionInfo(path, "\\StringFileInfo\\{:04x}{:04x}\\FileDescription".format(language, codepage)) or default 
    except: 
     return default 

# gets the process list via W32API   
def get_process_list(): 
    proc_list = [] 
    processes = EnumProcesses() 
    if not processes: 
     return [] # optionally raise an exception, no ProcessIds could be obtained 
    for proc in processes: 
     try: 
      handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, pywintypes.FALSE, proc) 
      modules = EnumProcessModules(handle) 
      if not modules: 
       continue # task died in the meantime? 
      path = GetModuleFileNameEx(handle, modules[0]) 
      proc_list.append({"ProcessId": proc, "ExecutablePath": path, "Description": get_executable_desc(path, path)}) 
     except pywintypes.error as e: 
      continue # optionally report the error stored in `e` 
    return proc_list 

tasks = get_process_list() 
for row in tasks: 
    print(row) # prints a dict for each task with ProcessId, ExecutablePath and Description fields 

이것은 ProcessId, ExecutablePath 및 Description 만 가져올 수 있지만 더 많은 필드가 필요하면 Win32 API를 더 자세히 탐색 할 수 있습니다.

다시 말하지만, Description 필드가이 모든 문제를 해결하는 데 어떤 가치가 있는지는 알 수 없지만, 실제로이 정보를 얻으려면이 방법을 사용하는 것이 좋습니다.

+0

내가 설명을 원한다는 이유는 .. 나는'python.exe'처럼 실행되는 exes가 중복되어있어, 설명의 종류가 어떤 python 스크립트가 실행되어 수정 동작을 취할 수 있는지 알 수 있습니다.내 요구 사항을 충족시키는 더 좋은 방법이 있습니까? – user3508811

+0

당신은'Description' 필드에서 그것을 얻지 못할 것입니다. (각 스크립트마다 다른 인터프리터/virtualenv를 사용하지 않는 한) 두 번째 예제를 사용하고 각 작업의'CommandLine' 필드를 확인하는 것이 더 좋습니다. 실행중인 다른 파이썬 스크립트를 식별하는 것이 필요한 경우 WMIC 명령을 줄여서 전체 작업 목록을 가져 오는 대신 'name ='python.exe ' "get/format : list"로 지정할 수도 있습니다. – zwer

+0

4 가지 옵션이 있습니다. 어느 것이 하나의 sugggest입니까? 너무 자세하게 ... – user3508811