Label und os.system

Fragen zu Tkinter.
Antworten
mike2707
User
Beiträge: 9
Registriert: Mittwoch 26. März 2014, 20:47

Hallo Leute,

ich bin Anfänger. Erstmal hallo :)

Ich versuche eine Systemübersicht zu basteln. Komme jedoch an einer Stelle wo ich nicht mehr weiter weiss.
Vielleicht kann jemand helfen.

Ich möchte die Größe vom Arbeitsspeicher in einem Label anzeigen lassen.

Bis jetzt habe ich.

Code: Alles auswählen

Label(root, text="Größe des Arbeitsspeichers: ").grid(row=6,column=0)
Label(root, text=os.system("cat /proc/meminfo | grep -i MemTotal") ).grid(row=6,column=1)
Das Ergebnis von os.system wird auf der Console ausgeführt, aber nicht in das Label gepackt.
Wie gehe ich am besten vor um an das Ziel zu kommen?

PS: Python3

Besten Gruß
Michael
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@mike2707: am besten nimmst Du Pythonmittel um die Datei '/proc/meminfo' zu lesen.
BlackJack

@mike2707: Was Sirius3 gesagt hat.

Ist auch ein Beispiel für „useless use of ``cat``” BTW. Das könnte man auf der Shell ohne ``cat`` und Pipe einfacher ausdrücken als ``grep -i MemTotal /proc/meminfo``.

Wenn das ganze unabhängig vom Betriebssystem sein soll, empfehle ich das `psutil`-Modul:

Code: Alles auswählen

In [19]: psutil.virtual_memory().total / 1024
Out[19]: 4008132L

In [20]: !grep -i MemTotal /proc/meminfo
MemTotal:        4008132 kB
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und warum das nicht funktioniert hat: `os.system` gibt nicht die Standardausgabe zurueck, sondern den Exitcode des Prozesses.
Fuer dein Anliegen brauchst du `subprocess` und seine Stream-Umleitung.

Aber fuer das Problem an sich haelst du dich besser an Sirius3 und BlackJack.
mike2707
User
Beiträge: 9
Registriert: Mittwoch 26. März 2014, 20:47

Hallo,
danke für die zahlreichen Antworten.

Werde mir die Tipps von euch ansehen. Man lernt ja nie aus :)

Gruß
Michael
mike2707
User
Beiträge: 9
Registriert: Mittwoch 26. März 2014, 20:47

Hallo Leute,
PS: Nicht wundern, habe zuerst die CPU-Infos ausgelesen. Der Arbeitsspeicher ist aber analog dazu.

ich habe mein Problem vorerst mal so gelöst.
Vielleicht nicht best practise, aber für einen anderen Leser vielleicht hilfreich.

Code: Alles auswählen

def cpuinfo():
    cpuinfo = open("/proc/cpuinfo")
    for c in cpuinfo:
         if "model name" in c:
              d = c.split(":")
    cpuinfo.close()
    return(d[1].rstrip() )
Danke nochmal an alle. :)

Gruß
Mike
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ja, da lässt sich noch etwas machen ;)

Code: Alles auswählen

def read_info(path, selector):
    with open(path) as info:
        for line in info:
            if selector in line:
                name, content = line.split(':', 1)
                return content.rstrip()

def read_cpuinfo():
    return read_info('/proc/cpuinfo', 'model name')

def read_meminfo():
    return read_info('/proc/meminfo', 'MemTotal')
Mit `with` muss man sich nicht mehr um das manuelle schliessen der Datei kuemmern und das wird sogar im Fehlerfall erledigt.
mike2707
User
Beiträge: 9
Registriert: Mittwoch 26. März 2014, 20:47

Danke für die Anregung..
Ist ein Weg sich viel Tiparbeit zu sparen.

Gruß
Mike
Antworten