Console Eingabe

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Console Eingabe

Beitrag von ProgOldie »

Ich möchte gern eine geöffnete Console so benutzen als wäre es eine Windowsconsole mit der Möglichkeit zur Eingabe wie cd.. etc.

Code: Alles auswählen

EnableExplicit
Define commandLine.s,aktDir.s
OpenConsole()                                
    ConsoleTitle ("PureBasic - Console Example:") 
    ConsoleLocate (18,2)                          
    aktDir = GetCurrentDirectory()
    Print (aktDir)        
    Repeat
    commandLine=Input()  
    PrintN (commandLine)
  
Until UCase(commandLine)="QUIT"    
    
    CloseConsole()
End
Obwohl ich im Compiler die entsprechende Consolen-Option eingestellt habe werden die Eingaben aber nicht interpretiert.
Wie erreicht man das?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Console Eingabe

Beitrag von jacdelad »

Was genau meinst du mit "interpretiert"? Sollen die Eingaben 1:1 wie in der Konsole abgearbeitet werden? Dann solltest du dir mal "RunProgram" anschauen. Bei den Befehlen wie CD und dir musst du natürlich selbst Hand anlegen oder per RunProgram und Pipe die Ausgabe umleiten bzw. abgreifen.

Ich frage mich aber gerade, wozu...?
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Console Eingabe

Beitrag von ProgOldie »

Das nützt leider nichts. Da passiert nichts.

Code: Alles auswählen

EnableExplicit
Define commandLine.s,aktDir.s
OpenConsole()                                
    ConsoleTitle ("PureBasic - Console Example:") 
    ConsoleLocate (18,2)                          
    aktDir = GetCurrentDirectory()

    Print (aktDir)        
    Repeat
      commandLine=Input()
      RunProgram(commandLine)
  
Until UCase(commandLine)="QUIT"    
    
    CloseConsole()
End
@ jacdelad : Es gibt einige Programme, die nur über Console gesteuert werden. Wenn ich z.B. meine Python-Version haben will,
geht dies mit py --version
Um so etwas zu vereinfachen, will ich das mit Buttons vereinfachen.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Console Eingabe

Beitrag von ccode_new »

Hallo,
du kannst andere Programme mit "RunProgram" aufrufen.

Du musst den aufgerufenen Programmen aber auch die notwendigen Parameter mitgeben und bei Leerstellen im Text müssen Anführungszeichen um den Befehl gesetzt werden.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Console Eingabe

Beitrag von jacdelad »

Hm, ok, aber dazu muss dein Programm ja kein Konsolenprogramm sein, bzw. darf es nicht, wenn du Buttons usw. verwenden willst. RunProgram ist, wie hier schon mehrfach angesperochen, der richtige Befehl. In der Hilfe ist auch ein Beispiel, wie man mit dem aufgerufenen Programm kommunizieren kann, so kannst du die Ausgabe von Python abfangen (auch ganz ohne sichtbares Fenster).
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Console Eingabe

Beitrag von ProgOldie »

An dem Beispiel aus der Hilfe verstehe ich nicht, wie man da z.B. das Gewünschte py --version einbauen kann.
Dazu bitte noch eine Hilfe, damit ich verstehe, wie und wo da z.B. py --version eingebaut werden kann.

Code: Alles auswählen

Compiler = RunProgram(#PB_Compiler_Home+"compilers/pbcompiler", "-h", "", #PB_Program_Open | #PB_Program_Read)
  Output$ = ""
  If Compiler
    While ProgramRunning(Compiler)
      If AvailableProgramOutput(Compiler)
        Output$ + ReadProgramString(Compiler) + Chr(13)
      EndIf
    Wend
    Output$ + Chr(13) + Chr(13)
    Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
    
    CloseProgram(Compiler) ; Schließt die Verbindung zum Programm
  EndIf
  
  MessageRequester("Output", Output$)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Console Eingabe

Beitrag von jacdelad »

Funktioniert bei mir wunderbar, musst natürlich auf den Pfad von Python umleiten (erste Zeile):

Code: Alles auswählen

Compiler = RunProgram("C:\Windows\py.exe", "--version", "C:\Windows", #PB_Program_Open | #PB_Program_Read)
Output$ = ""
If Compiler
  While ProgramRunning(Compiler)
    If AvailableProgramOutput(Compiler)
      Output$ + ReadProgramString(Compiler) + Chr(13)
    EndIf
  Wend
  Output$ + Chr(13) + Chr(13)
  Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
  
  CloseProgram(Compiler) ; Schließt die Verbindung zum Programm
  MessageRequester("Output", Output$)
Else
  Debug "Fehler"
EndIf
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Console Eingabe

Beitrag von ccode_new »

Try this:
(Linux, MacOs)

Code: Alles auswählen

Define.s output
Define *pout
Define *pstr = UTF8("python -v 3>&1 1>&2 2>&3")
Define *modus = UTF8("r")
Define.i plen
Define buffer.s

*pout = @buffer

prog = popen_(*pstr, *modus)

While( prog <> #Null And feof_(prog) = #Null)
  getline_(@*pout, @plen, prog)
  output + PeekS(*pout, #PB_Any, #PB_UTF8)
  Debug output
Wend
pclose_(prog)

FreeMemory(*pstr):FreeMemory(*modus)

Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Console Eingabe

Beitrag von ProgOldie »

Danke für die Hilfen. Ich habe damit auch einen Weg zur Angabe der Pfade gefunden:

Code: Alles auswählen

EnableExplicit
Define.s Env_Variables,EnvVar
Define P.i
OpenConsole()

Env_Variables=GetEnvironmentVariable("PATH")

Repeat
  P=FindString(Env_Variables,";",1)
  EnvVar=Left(Env_Variables,P-1)
  Env_Variables=RemoveString(Env_Variables,EnvVar+";",1)
  PrintN(EnvVar)
Until Env_Variables=""

  PrintN("Druecken Sie Enter zum Beenden.")
  Input() 
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten