Python und Systeminformationen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 15:50

Grüße liebe Gemeinde,

wie kann man unter Python Systeminformationen, wie RAM, CPU, und insbeseondere MAC Adresse möglichst Plattformunabhängig auslesen ?

gibt es da eine nette Möglichkeit, die ich bisher nicht gefunden hab ?

mfg
Drizzt
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 8. März 2006, 15:55

wie kann man unter Python Systeminformationen, wie RAM, CPU, und insbeseondere MAC Adresse möglichst Plattformunabhängig auslesen ?
Gar nicht. Plattforumunabhängig erst recht nicht. Alles sonst ist in Erweiterungen verpackt, siehe zum Beispiel unter Windows wmi (was mittels pywin32 ansprechbar ist), oder unter Linux das /proc-Dateisystem. Unter anderen Unix-artigen Systemen gibts auch /proc, aber das Format der Dateien und die Informationen unterscheiden sich von System zu System massiv.
--- Heiko.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 16:20

Hi Heiko,

vielen Dank für die Schnelle Antwort, jedoch für mein Anliegen etwas zu overpowered da an die API zu gehen. da ist es einfacher die MAC - Adress abzuschreiben ;)

Gruß
Drizzt
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 21:57

Servus nochmal,

ich hab mich doch mal rangewagt, auch wenn es wohl doch nicht zum Einsatz kommt, aber denoch aus Gründen des kennenlernens mit Python:

Ich habe mir mal unter Windows (2k) das pywin32 / win32com Modulpaket installiert (Python 2.4) und finde leider keine Informationen, wie ich an die Hardwareinformationen komme.

Irgendwelche Anregungen eventuell ?

mfg
Drizzt
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 8. März 2006, 22:05

Drizzt hat geschrieben:und finde leider keine Informationen, wie ich an die Hardwareinformationen komme. Irgendwelche Anregungen eventuell?
Hi Drizzt!

Vielleicht findest du hier etwas:
http://www.microsoft.com/technet/script ... index.mspx

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 8. März 2006, 22:11

Hiermit bekommst du auch die MAC-Adressen raus:
http://www.microsoft.com/technet/script ... spy05.mspx

Das habe ich auch noch gefunden. Sieht wirklich nicht schlecht aus. :-)
http://timgolden.me.uk/python/wmi_cookbook.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 22:15

Nabend Gerold,

inzwischen hab ich es mit WMI gelöst,

Code: Alles auswählen

import wmi 

c = wmi.WMI()
for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
  print interface.Description, interface.MACAddress
  for ip_address in interface.IPAddress:
    print ip_address
  print
Nun hadere ich gerade daran, auszulesen etwas über das System, z.B: Prozessor / Ram / physischer Harddisk etc. etwas zu erfahren.

Danke aber für Dein Tip, erweitert natürlich den Horizont "where to look at" ;)

*edit*
http://www.microsoft.com/technet/script ... index.mspx
Das sollte es erschlagen, so hoffe ich, Danke nochmals
*edit*

mfg
Drizzt
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 22:32

Nun doch noch eine Anmerkung / Frage. Da ich noch nicht so grün bin, und den Fehler noch nicht wie gewünscht auf den Ursprung folgen kann :

http://www.microsoft.com/technet/script ... apy04.mspx
(benutztes Beispiel code 1:1 Kopie]

Fehlermeldung

Code: Alles auswählen

Admin Password Status: 

Traceback (most recent call last):
  File "C:/Dokumente und Einstellungen/Administrator/Desktop/py/win32test2.py", line 7, in -toplevel-
    print "Admin Password Status: ", objItem.AdminPasswordStatus
  File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 454, in __getattr__
    raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self), attr)
AttributeError: '<win32com.gen_py.Microsoft WMI Scripting V1.1 Library.ISWbemObject instance at 0x25490216>' object has no attribute 'AdminPasswordStatus'
Kann ich mir die Eigenschaften/Attribute anzeigen lassen z.B. in einer for Schleife und (len) Abfrage ?

Code: Alles auswählen

colItems = objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
mfg
Drizzt
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 8. März 2006, 22:56

Code: Alles auswählen

dir(<objekt>)
geht eigentlich bei allen Python-Objekten, und soweit ich weiß geht es auch bei win32.Dispatch()-Objekten und gibt eine Liste von Namen von Attributen aus (also sowohl Funktionen als auch Datenelemente). Zumindest wäre das was was Du mal ausprobieren könntest.

Sonst gibts ja immer noch die entsprechenden Type-Libraries, die man sich angucken kann.
--- Heiko.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Mittwoch 8. März 2006, 23:09

Erstmal Danke für den Tip ;)

Was mich aber verwirrt, ist einerseits das Script bei Mickeysoft, welches ja auf Daten aus einem Objekt bzw. Hash zugreift, und nun selbige im Objekt (wie oben schon in der Fehlermeldung zu lesen) garnicht verfügbar sind:

Code: Alles auswählen

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_ComputerSystem")
print dir(colItems)
(Mal die Ausgabe von der MS Seite weggelassen und dafür das dir() benutzt.

Ausgabe:

Code: Alles auswählen

>>> 
['CLSID', 'Item', '_ApplyTypes_', '_NewEnum', '__call__', '__cmp__', '__doc__', '__getattr__', '__getitem__', '__init__', '__int__', '__iter__', '__len__', '__module__', '__nonzero__', '__repr__', '__setattr__', '__str__', '__unicode__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']
Noch eine Idee, wie ich meiner gewünschten Information näher komme, oder habe ich einfach einen Denkfehler ?

mfg
Drizzt
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 8. März 2006, 23:17

Nö, kein Denkfehler. Das bedeutet im Endeffekt dass die Methoden und Argumente die das Objekt zur Verfügung stellt nicht "vordefiniert" sind (was bedeuten würde dass sie in der Ausgabe von dir() auftauchen), sondern dynamisch mittels __getattr__ zur Verfügung gestellt werden (was ja auch in der entsprechenden Ausgabe auftaucht).

Ich hatte mal gelesen, dass pywin32 die entsprechenden Objekte aus den Type-Libraries ausliest (sprich den kompilierten IDL-Files) und halt eben als Attribute auf dem Dispatcher-Objekt für die entsprechende Klasse setzt so dass sie als reale Einträge im Namensraum des Objekts auftauchen (die dir() dann anzeigt), aber dem ist ja anscheinend nicht so, oder für das was Du da unten benutzt hast existiert keine Type-Library die pywin32 zum Erstellen des Dispatcher-Objekts benutzt hätte. (Es ist sicherlich irgendwo auf Deinem System eine Type-Library für die WMI-Komponente die Du da benutzt; mußt Dich mal auf die Suche begeben und dann das ganze mit einem Browser für Type-Libraries angucken, der Dir mehr oder weniger den IDL-Code zeigt, der das bereitgestellte Interface eben auch definiert und Dir vor allen Dingen die Attribute und Methodensignaturen zeigt)

Aber, da ich kein Win32-Programmierer bin, kann ich mich auch kollosal irren (zumindest glauben tu ich das nicht, sonst hätte ich nicht geantwortet, aber jemand belehre mich eines besseren). ;-)
--- Heiko.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 9. März 2006, 16:01

Was mir da spontan einfällt... (nee kein Link ;) )

Man könnte doch eigentlich ein Modul schreiben, was einige Hardware-Informationen unter Windows und Linux preisgibt. Also eine Einheitliche Schnittstelle, die unter Windows halt über win32com geht und unter Linux das proc Verzeichnis...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Donnerstag 9. März 2006, 20:11

sowas hab ich schonmal im groben gemacht

aber nur für die sachen die ich gebraucht habe.

problem ist das du unter windows die win32all installiert haben musst.
ausserdem kriegst du nicht alles darüber, für cpu spezifische sachen gehts am besten mit asm imo - blos geht das afaik nicht in python

Warum ist win32 noch nicht im Python Core, grummel, gibt ja schlieslich auch eine *NIX only sektion ....
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Samstag 11. März 2006, 02:29

Vielleicht könntest du es freundlicherweise publizieren oder posten um uns einen Einblick zu gewähren.

mfg
Drizzt
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 12. März 2006, 13:28

@Mad-Marty: Das ist doch schonmal ein Anfang! Man müßte das ganze sehr Modular aufbauen und erstmal nur ein paar Grundlegende Infos bereitstellen. Wenn man irgendwas spezielles benötigt, kann man das ja dann einbauen.

z.B. Wollte ich mal wissen, wieviel Platz auf einem Laufwerk/Partition noch frei ist: http://www.python-forum.de/viewtopic.php?t=842

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten