2016-10-16 1 views
-2

Feed Ich habe ein Skript mit dem Namen GetStats.py.Erhalten Sie die Eingabe von Benutzer an der Befehlszeile und verwenden Sie diese Eingabe, um Variablen in Python-Skript

Auf einem hohen Niveau, das GetStats.py Skript führt Folgendes aus:

1) stellt eine Verbindung zu einer externen Datenbank 2) ruft einige Daten aus dieser Datenbank 3) schreibt die in Schritt 2, um eine abgerufenen Daten csv-Datei

Wichtig ist, dass das Skript GetStats.py eine Konfigurationsdatei (.cfg) referenziert, die (neben vielen anderen Details) die IP-Adresse und Serverdetails der bestimmten Datenbank enthält, mit der eine Verbindung hergestellt werden soll.

Das GetStats.py Skript setzt voraus, dass der Benutzer die folgenden Parameter in der Befehlszeile übergeben:

a) die Anzahl der Tage von Daten abzurufen (dh der Blick Periode zurück) b) die Granularität der Daten (was entweder stündlich oder täglich ist) c) ob ein begrenzter Satz von Daten (der ungefähr 30 Minuten dauert) oder der vollständige Satz von Daten (der ungefähr 1 Stunde und 15 Minuten dauert)

I habe auch eine Batch-Datei, mit der ich alles ausführen kann. Die Batch-Datei sieht wie folgt aus:

GetStats.py Client_A.cfg 30 -d -full 
GetStats.py Client_B.cfg 30 -d -full 
GetStats.py Client_C.cfg 30 -d -full 
GetStats.py Client_D.cfg 30 -d -full 
GetStats.py Client_E.cfg 30 -d -full 
... and so on up to Client_M 

Wie wir aus der Batch-Datei oben sehen können, wird das GetStats.py Skript aufgerufen und es läuft gegen Client_A durch Client_E für einen Zeitraum von 30 Tagen, mit täglicher Granularität und kehren der vollständige Satz von Daten.

Das Problem ist, dass, wenn ich einen dieser Parameter ändern möchte (z. B. die Anzahl der Tage in der Look-Back-Periode, die Daten Granularität und/oder die Menge der Daten zurückgeben), muss ich den Batch bearbeiten Datei direkt, und dieser Vorgang kann einige Minuten dauern.

Ich möchte den Prozess optimieren, so dass der Benutzer die folgenden nur aufgefordert wird, sobald in der Befehlszeile, wenn die Batch-Datei ausgeführt wird:

„Bitte geben Sie die Anzahl der Tage zurückblicken : "

‚Bitte geben Sie die Granularität der Daten:‘

‚Bitte geben Sie den Datensatz zurück:‘

ich einige Gedanken zu gegeben haben, wie diese zu übernehmen drei Parameter direkt in das GetStats.py-Skript.

Aber ich denke, ich auf ein Problem stoßen wird, da die Batch-Datei wird die GetStats.py Skript ausführen und dann den Benutzer für die 3 Parameter prompt über jedes Mal das GetStats.py Skript aufgerufen wird (die derzeit 13 mal).

Ich möchte nicht, dass der Benutzer "30", "-d" und "-full" insgesamt 13 Mal eingeben muss. Ich möchte, dass der Benutzer "30", "-d" und "-full" nur einmal eingibt.

Hat jemand irgendwelche Ideen, wie ich den Benutzer für die oben genannten 3 Parameter nur einmal fragen kann, nachdem die Batch-Datei ausgeführt wird?

Danke!

+2

Warum tun Sie müssen das in Python tun? Es handelt sich um einen neuen Prozess für jede Zeile in der Stapeldatei. Daher ist es nicht sinnvoll, den Status über diese hinweg zu teilen. Nehmen Sie die Eingabe in der Batch-Datei. Oder, wenn Sie es nur verwenden, verwenden Sie z. 'awk', um schnell jede Zeile in der Batch-Datei zu bearbeiten. – jonrsharpe

+0

Nein, ich benutze es nicht nur. Ich hätte lieber den Benutzer aufgefordert, die 3 genannten Parameter einzugeben. Ich verstehe nicht, was du über "geteilten Staat" sagst (ich bin relativ neu in Python und Programmierung im Allgemeinen). – equanimity

Antwort

0

Erwägen Sourcing Ihre GetStats.py als Modul in einem anderen Py-Skript, das Benutzereingabe über input() (oder raw_input() in Python 2) empfängt. Auf diese Weise benötigen Sie keine Batch-Datei oder Eingabe von Parametern über die Befehlszeile, die keine benutzerfreundliche Oberfläche ist. Außerdem können Sie alle Client-Typen für einen DRY-er-Ansatz durchlaufen, indem Sie string.ascii_uppercase verwenden. Unten ist Setup:

GetStats.py

(gesamte Skript in einem definierten Modul wickeln die params zuvor gesendeten per Kommandozeile, nicht mehr die sys.argv[] Sammlung Empfangen)

def processData(clienttype, lookbackdaysparam, granularityparam, datasettypeparam): 
    #...script... 

UserInput.py

(in derselben direc als GetStats.py; betrachten Steuerung für numerische/string Werte)

import GetStats 
from string import ascii_uppercase 

lookbackdays = ''; granularity = ''; datasettype = '' 

# LOOP RUNS INFINITELY PROMPTING INPUT UNTIL USER FILLS OUT EACH ONE: 
while True:  
    if lookbackdays == '': 
     lookbackdays = input("Please enter the number of days to look back: ") 

    elif granularity == '': 
     granularity = input("Please enter the granularity of the data: ") 

    elif datasettype == '': 
     datasettype = input("Please enter the data set to return: ") 

    else: 
     break 

# LOOPS THROUGH LETTERS A-M 
for c in ascii_uppercase[0:13]: 
    GetStats.processData('Client_'+c+'.cfg', lookbackdays, granularity, datasettype) 

print("Successfully processed data!") 

Tkinter GUI

noch besser, eine tatsächliche GUI-Schnittstelle betrachten mit dem tkinter Modul (vorinstalliert in Python 3):

import GetStats 
from tkinter import * 
from tkinter import ttk 
from string import ascii_uppercase 

class GUIapp(): 

    def __init__(self): 
     self.root = Tk() 
     self.buildControls() 
     self.root.mainloop() 

    def buildControls(self):   
     self.root.wm_title("Get Stats Menu") 
     self.guiframe = Frame(self.root, width=2500, height=500, bd=1, relief=FLAT) 
     self.guiframe.pack(padx=5, pady=5) 

     # IMAGE 
     self.photo = PhotoImage(file="Stats.png") 
     self.imglbl = Label(self.guiframe, image=self.photo) 
     self.imglbl.photo = self.photo 
     self.imglbl.grid(row=0, sticky=W, padx=5, pady=5) 
     self.imglbl = Label(self.guiframe, text="Enter parameters for data request", 
          font=("Arial", 12)).\ 
          grid(row=0, column=1, sticky=W, padx=5, pady=5) 

     # PERIOD DAYS 
     self.periodDayslbl = Label(self.guiframe, text="Please enter the number of days to look back: ", 
            font=("Arial", 10)).grid(row=1, sticky=W, padx=5, pady=5) 
     self.periodDaysvar = StringVar() 
     self.periodDaystxt = Entry(self.guiframe, textvariable=self.periodDaysvar, 
            relief=SOLID, font=("Arial", 10), width=34).\ 
            grid(row=1, column=1, sticky=W, padx=5, pady=5) 

     # DATA GRANULARITY 
     self.granularitylbl = Label(self.guiframe, text="Please enter the granularity of the data: ", 
           font=("Arial", 10)).grid(row=2, sticky=W, padx=5, pady=5) 
     self.granularityvar = StringVar() 
     self.granularitytxt = Entry(self.guiframe, textvariable=self.granularityvar, 
           relief=SOLID, font=("Arial", 10), width=34).\ 
           grid(row=2, column=1, sticky=W, padx=5, pady=5) 

     # DATASET TO RETURN 
     self.datasetTypelbl = Label(self.guiframe, text="Please enter the data set to return: ", 
           font=("Arial", 10)).grid(row=3, sticky=W, padx=5, pady=5) 
     self.datasetTypevar = StringVar() 
     self.datasetTypetxt = Entry(self.guiframe, textvariable=self.datasetTypevar, relief=SOLID, 
           font=("Arial", 10), width=34).\ 
           grid(row=3, column=1, sticky=W, padx=5, pady=5) 

     # PROCESS BUTTON 
     self.btnoutput = Button(self.guiframe, text="PROCESS", 
           font=("Arial", 10), width=25, command=self.processData).\ 
           grid(row=4, column=1, sticky=W, padx=10, pady=5) 

    def processData(self): 
     if self.periodDaysvar.get() != '' and self.granularityvar.get() != '' and self.datasetTypevar.get() != '':  
      for c in ascii_uppercase[0:13]: 
       GetStats.processData('Client_'+c+'cfg', self.periodDaysvar.get(), 
            self.granularityvar.get(), self.datasetTypevar.get())     
       messagebox.showinfo("SUCCESFUL OUTPUT", "Successfully processed data!") 
     else: 
      messagebox.showerror("MISSING FIELD", "Please enter all fields to process request.") 

if __name__ == "__main__": 
    GUIapp() 

GUI Menü (Bild ist ein kleines Bild Stats.png in demselben Verzeichnis wie Skript namens)

GUI Menu

Meldungsfelder (auf Schaltfläche Prozess Klick genannt)

GUI Success Message GUI Error Message

Verwandte Themen