2009-10-27 27 views
5

I amm scrivere un piccolo script python che acquisirà le informazioni dalle VM di Windows in cui sono in esecuzione.Elencare i processi in esecuzione su Windows a 64 bit

Al momento posso elencare i processi su una macchina a 32 bit XP con il seguente metodo:

http://code.activestate.com/recipes/305279/

E 'possibile rilevare in qualche modo la versione di Windows in esecuzione e excute un metodo diverso per ottenere il processi su una macchina a 64 bit, sto cercando di ottenere i processi da 64 bit Windows 7 e Vista a 64 bit.

Qualche idea?

risposta

15

C'è un'altra ricetta su activestate che fa una cosa simile, ma utilizza invece la libreria di Performance Data Helper (PDH).

Ho provato questo sulla mia macchina Windows 7 a 64 bit e funziona lì - quindi presumibilmente la stessa funzione funzionerà su entrambe le finestre a 32 bit e 64 bit.

Potete trovare la ricetta qui: http://code.activestate.com/recipes/303339/

Un altro metodo utilizza WMI, c'è un esempio qui in Python utilizzando il modulo wmi:

http://timgolden.me.uk/python/wmi/cookbook.html

import wmi 
c = wmi.WMI() 

for process in c.Win32_Process(): 
    print process.ProcessId, process.Name 
+0

WMI funziona bene per questo –

+0

fa WMI lavoro su Windows a 64 bit anche? Non riesco a vedere nulla sul sito che menzioni 64bit, o usi gli stessi nomi dei metodi? – RailsSon

+0

Dovrebbe funzionare allo stesso modo (compreso il metodo) nomi per entrambi gli ambienti. –

0

Si dovrebbe essere in grado di farlo esponendo Windows Management Instrumentation all'interno di ogni VM. Questo strumento permette di accedere a una serie di dati di sistema, inclusi i processi, si veda http://technet.microsoft.com/en-us/library/cc757287%28WS.10%29.aspx

si dovrebbe essere in grado di popen uno dei comandi nel link precedente per ottenere le informazioni che stai cercando.

+1

E 'significativamente migliore di utilizzare uno strumento come win32process o psutils quanto lo sia per l'uscita del tubo da un comando a riga di comando. Qualcosa che è intenzionalmente integrato con python sarà sempre più facile e più pulito da usare. –

6

per scopi simili ho usato psutil biblioteca. Ecco alcuni suggerimenti:

  • processi lista con psutil.pids() (reference)
  • controllano le informazioni di processo con process = psutil.Process(pid) (reference)
  • fare process.kill o process.terminate()

Installation sulle finestre - pip farà installazione dal fonte (che significa compilazione), quindi probabilmente vorrai scaricare l'installazione binaria da https://pypi.python.org/pypi/psutil/#downloads.

+5

psutil limita l'output dei processi all'utente corrente che esegue lo script python. Quindi un utente non amministratore non vedrà processi privilegiati. – rosch

1

Il modo più pulito che ho trovato per risolvere questo è stato quello di utilizzare la libreria psutil come raccomandato da Robert Lujo:

psutil.process_iter() 

noti che restituisce un oggetto generatore, l'emissione di un oggetto processo alla volta. Per esempio, se avete bisogno l'elenco dei nomi di processo, si può fare qualcosa di simile:

[p.name() for p in psutil.process_iter()] 
+0

ciao, quello è bello, solo una domanda, poichè p è un processo con pid e nome, perché prendi p.name() con parentesi? e perché non funziona se voglio ottenere i pids? Sto cercando di ottenere il pid/nome corrispondente –

Problemi correlati