istike2
Goto Top

JSON-Datei in Python auswerten und mit wxGlade zeigen

Hallo,

wir haben einen Powershell-Script, der - aus Performancegründen - ein Objekt anlegt und die Ergebnisse (Werte der Variablen) in einer JSON-Datei speichert:

$cinfo = Get-ComputerInfo
# Construct and output and object whose properties contain all data of interest, in JSON format.
[pscustomobject] @{
  winver = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId  
  OsName = $cinfo.OsName
  OsVersion = $cinfo.OsVersion
  OsBuildNumber = $cinfo.OsBuildNumber
  OsHardwareAbstractionLayer = $cinfo.OsHardwareAbstractionLayer
  OfficeVer = Get-ItemPropertyValue "registry::HKEY_CLASSES_ROOT\Word.Application\CurVer" '(default)'  
} | ConvertTo-Json

Die Frage ist nur, wie ich die JSON-Datei in meinem Python-Code entsprechend auswerten kann.
[Die Ergebnisse sollten mit einem wxGlade-GUI dargestellt werden.
Die GUI wird am Ende auch einige Variablen wie Pfade usw. an den PowerShell-Code weitergeben.]

Wie lese ich z. B. also aus dem JSON-Datei den Wert von "OsName" aus?

Vielen Dank für eine kurze Rückmeldung.

I.

Content-Key: 1616523015

Url: https://administrator.de/contentid/1616523015

Printed on: April 20, 2024 at 04:04 o'clock

Member: michi1983
Solution michi1983 Dec 13, 2021 at 22:40:02 (UTC)
Goto Top
Hi,

ein Versuch:

 json_object = json.loads(pscustomobject)
 print(json_object["OsName"])  

Gruß
Member: istike2
istike2 Dec 14, 2021 at 08:14:15 (UTC)
Goto Top
Vielen Dank "Michi1983", ich werde es ausprobieren face-smile
Member: istike2
istike2 Dec 14, 2021 updated at 19:37:12 (UTC)
Goto Top
Hi, Ich habe es am Ende so zusammengebastelt, tut aber nicht so richtig ...

Als Fehlermeldung bekomme ich

  File "C:\Daten\3_Ist\XXXXXX\Fortbildung\Python\GUI-Testprojekte wxGlade\PS-Test\PC-Info auslesen.py", line 58, in <module>  
    dict_ = json.loads(json_from_powershell).stdout
NameError: name 'json_from_powershell' is not defined  

Ich verstehe die Fehlermeldung nicht wirklich, ich habe es ja definiert in dem Method ...


#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 1.0.3 on Mon Dec 13 21:54:48 2021
#

import wx
import json, subprocess  # IMPORT FOR SUB PROCESS . RUN METHOD
from pathlib import Path  # necessary to find files

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade

# Some Basic Infos for Powershell
POWERSHELL_PATH = "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe"  # POWERSHELL EXE PATH  
ps_script_path = "C:\\Daten\\3_Ist\\XXXXXXX\\Fortbildung\\Python\\GUI-Testprojekte wxGlade\\PS-Test\\pcinfo_auslesen.ps1"  
# YOUR POWERSHELL FILE PATH


# I create here the function/class to execute the PS-Script
class Utility:  # SHARED CLASS TO USE IN OUR PROJECT

    @staticmethod    # STATIC METHOD DEFINITION
def readpcinfo(ps_script_path, *params):  # SCRIPT PATH=POWERSHELL SCRIPT PATH, PARAM =POWERSHELL SCRIPT PARAMETERS

        commandline_options = [POWERSHELL_PATH, '-ExecutionPolicy', 'Unrestricted', ps_script_path]  
        # ADD POWERSHELL EXE AND EXECUTION POLICY TO COMMAND VARIABLE
        for param in params:  # LOOP FOR EACH PARAMETER FROM ARRAY
            commandline_options.append("'" + param + "'")  # APPEND YOUR FOR POWERSHELL SCRIPT  

        # CALL PROCESS
        json_from_powershell = subprocess.run(commandline_options, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

        print(json_from_powershell.returncode)  # PRINT RETURN CODE OF PROCESS
        print(json_from_powershell.stdout)      # PRINT STANDARD OUTPUT FROM POWERSHELL
        print(json_from_powershell.stderr)      # PRINT STANDARD ERROR FROM POWERSHELL

# I store the keys in variables

        winver_label = dict_.get(winver, default=None)
        osname_label = dict_.get(osname, default=None)
        osversion_label = dict_.get(osversion, default=None)
        osbuildnumber_label = dict_.get(osbuildnumber, default=None)
        oslayer_label = dict_.get(oslayer, default=None)
        officever_label = dict_.get(officever, default=None)

        if json_from_powershell.returncode == 0:  # COMPARING RESULT
            message = "Success !"  
        else:
            message = "Error Occurred !"  

        return message  # RETURN MESSAGE

# Parse the JSON text into a dictionary.
dict_ = json.loads(json_from_powershell).stdout

# Enumerate the dictionary entries and print them.
for key in dict_:
    print(key + ': ' + dict_[key])  

class pcInfo(self, *args, **kwds):
    # begin wxGlade: pcinfo.__init__
    kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE  
    wx.Frame.__init__(self, *args, **kwds)
    self.SetSize((600, 370))
    self.SetTitle("frame")  

    grid_sizer_1 = wx.GridSizer(8, 2, 0, 0)

    label_7 = wx.StaticText(self, wx.ID_ANY, "PC Infos", style=wx.ALIGN_LEFT)  
    label_7.SetMinSize((500, 32))
    label_7.SetFont(wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, ""))  
    grid_sizer_1.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL | wx.FIXED_MINSIZE | wx.RESERVE_SPACE_EVEN_IF_HIDDEN, 0)

    grid_sizer_1.Add((0, 0), 0, 0, 0)

    label_8 = wx.StaticText(self, wx.ID_ANY, "OS Name")  
    grid_sizer_1.Add(label_8, 0, 0, 0)

    os_name_entry = wx.StaticText(self, wx.ID_ANY, osname_label)
    grid_sizer_1.Add(os_name_entry, 0, 0, 0)

    label_9 = wx.StaticText(self, wx.ID_ANY, "OS Version")  
    grid_sizer_1.Add(label_9, 0, 0, 0)

    os_version_entry = wx.StaticText(self, wx.ID_ANY, osversion_label)
    grid_sizer_1.Add(os_version_entry, 0, 0, 0)

    label_10 = wx.StaticText(self, wx.ID_ANY, "OS Build Number")  
    grid_sizer_1.Add(label_10, 0, 0, 0)

    os_build_entry = wx.StaticText(self, wx.ID_ANY, osbuildnumber_label)
    grid_sizer_1.Add(os_build_entry, 0, 0, 0)

    label_11 = wx.StaticText(self, wx.ID_ANY, " OsHardwareAbstractionLayer")  
    grid_sizer_1.Add(label_11, 0, 0, 0)

    os_hardware_entry = wx.StaticText(self, wx.ID_ANY, oslayer_label)
    grid_sizer_1.Add(os_hardware_entry, 0, 0, 0)

    label_12 = wx.StaticText(self, wx.ID_ANY, "Office Version")  
    grid_sizer_1.Add(label_12, 0, 0, 0)

    offive_ver_entry = wx.StaticText(self, wx.ID_ANY, officever_label)
    grid_sizer_1.Add(offive_ver_entry, 0, 0, 0)

    label_13 = wx.StaticText(self, wx.ID_ANY, "Winver")  
    grid_sizer_1.Add(label_13, 0, 0, 0)

    winver_entry = wx.StaticText(self, wx.ID_ANY, winver_label)
    grid_sizer_1.Add(winver_entry, 0, 0, 0)

    self.read_info = wx.Button(self, wx.ID_ANY, "Read PC Info")  
    self.read_info.SetFocus()
    grid_sizer_1.Add(self.read_info, 0, wx.ALL | wx.EXPAND, 0)

    grid_sizer_1.Add((0, 0), 0, 0, 0)

    self.SetSizer(grid_sizer_1)

    self.Layout()
    # end wxGlade

# end of class pcInfo


class pcInfo_class(wx.App):
    def OnInit(self):
        self.pcInfo_frame = pcInfo(None, wx.ID_ANY, "")  
        self.SetTopWindow(self.pcInfo_frame)
        self.pcInfo_frame.Show()
        return True

# end of class pcinfo_class

wx.button.configure(command=readpcinfo)

if __name__ == "__main__":  
    pcInfo = pcInfo_class(0)
    pcInfo.MainLoop()

Meine Fragen:

#1 Zeilen 43-48 lese ich das JSON-Object aus. Das Parsing erfolgt aber erst in Zeile 58. Ist es so richtig?
#2 80-114 schreibe ich die Wert in die Labels. Sind diese Angaben in der Class "pcInfo" überhaupt richtig? Sollen diese Befehle nicht Teil der Method / Funktion sein, die ich durch den Button aufrufe?
#3 Ich lese die PowerShell -Werte in der Methode aus und speichere sie in Variablen, die ich außerhalb der Methode einsetze. Dies funktioniert so anscheinend nicht. Welche Möglichkeiten gibt es dieser Werte - außerhalb der Methode - einzusetzen? Soll ich jede einzelne Variable als globale Variable definieren?

Gr. I.