Seite 1 von 1
Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 20:31
von hsvfan521
Hallo, ich bin neu hier und hätte direkt mal ne Frage.
Ich versuche mich noch nicht lange mit Python deswegen glaube ich das meine Frage ziemlich simpel ist. Also, ich wollte einfach nur wissen wie ich in einem Programm durch einen bestimmten Input ein bestimmtes anderes Programm (zB Windows Media Player oder sowas) öffnen kann.
In meinem Programm sieht es bisher so aus:
import os
os.system("c:\Pfad\programm.exe")
Das Problem ist, sobald ich den Input eingebe startet das Programm zwar, schliesst sich allerdings sofort wieder automatisch. Könnt ihr mir helfen?

Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 20:43
von jqz4n
Hallo,
os.system sollte aus verschiedenen Gründen nicht mehr angewendet werden. Stattdessen verwende man subprocess.popen()
Das ganze sieht dann wie folgt aus:
Code: Alles auswählen
import shlex, subprocess
command_line = input()
args = shlex.split(command_line)
p = subprocess.Popen(args)
p.wait()
(der Code entstammt weitestgehend der offiziellen Python-Donkumentation:
http://docs.python.org/library/subproce ... onstructor)
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 20:54
von darktrym
Und einfache Backslashe in Strings zu verwenden machen nur die uncoolen Jungs.
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 20:56
von hsvfan521
okay danke dir, aber so ganz verstehen tu ich es immer noch nicht...
Wo soll ich da denn eingeben welches Programm es ist?
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:02
von jqz4n
Das gibst du ganz am Anfang ein. Du gibst also "c:\Pfad\programm.exe C:\Pfad\zum\Dokument" ein (evtl. musst du auch "\" immer durch "\\" ersetzen, habe hier kein Windows), vorausgesetzt, dass Programm unterstützt das Entgegennehmen von Dateinamen über die Kommandozeile.
Du kannst auch das Ganze noch ein wenig bearbeiten, wenn du immer das selbe Programm auswählen und nur die Dateinamen ändern willst:
Code: Alles auswählen
import shlex, subprocess
command_line = input()
args = ["c:\\Pfad\\programm.exe"] + shlex.split(command_line) # hier müssen überall zwei Backslashes stehen! (Und man bekommt das Ganze bestimmt auch irgendwie "schöner" hin)
p = subprocess.Popen(args)
p.wait()
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:14
von hsvfan521
es funktioniert irgendwie nicht, syntax error und der : wird rot angezeigt?
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:20
von jqz4n
Mal ein paar Fragen:
1. Wie sieht denn Dein Quelltext aus?
(Bitte poste ihn zwischen [code=python]und[/code])
2. Was hast Du eingegeben?
3. Wie genau lautet der Syntax-Error? (Python gibt nie NUR Syntax-Error aus, sondern einige Angaben dazu)
4. Python färbt von sich aus nie irgendetwas rot ein. Welches Programm verwendest Du, um Python-Quellcode zu erstellen? Welcher Doppelpunkt wurde eingefärbt?
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:25
von hsvfan521
Code: Alles auswählen
test=raw_input ("eins,zwei")
if test == "eins":
import shlex, subprocess
command_line = raw_input ()
args = (c:\\Programme(x86)DVDVideoSoft\\Free YouTube to MP3 Converter.exe) + shlex.split(command_line)
p = subprocess.Popen (args)
p.wait
so sieht das ganze jetzt aus...
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:33
von BlackJack
@hsvfan521: Naja das sollte eigentlich klar sein denn der Name `c` gefolgt von einem Doppelpunkt ist an der Stelle keine gültige Python-Syntax. Du musst Zeichenketten schon entsprechend kennzeichnen damit der Compiler sie nicht als Python-Code ansieht.
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:37
von hsvfan521
Oh Gott ich Idiot ich häng schon den ganzen Tag da dran mittlerweile bin ich so unkonzentriert das ich die dümmsten Fehler mache...
Jetzt ist zwar kein Fehler mehr da, aber das Programm öffnet sich trotzdem noch nicht?
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:41
von jqz4n
Man müsste mal den Quelltext ein wenig bearbeiten:
1. p.wait ist eine Funktion. Es muss p.wait() heißen. (Hatte ich auch so eingegeben
2. imports kommen in der Regel an den Anfang
3. Variablennamen sollten aussagekräfiger sein ("p" und "test" sind nicht besonders toll.)
4. der Pfad zum Programm muss in Anführungszeichen gesetzt werden (hatte ich auch getan. Dies verursachte wohl den Fehler)
Code: Alles auswählen
import shlex, subprocess
menu_input=raw_input ("eins,zwei")
if menu_input == "eins":
command_line = raw_input()
args = ["c:\\Programme(x86)DVDVideoSoft\\Free YouTube to MP3 Converter.exe"] + shlex.split(command_line)
p = subprocess.Popen (args)
p.wait()
(Das ändert nichts an der Funktionalität des Programms, entspricht aber der Syntax.)
Dies funktioniert möglicherweise aufgrund der Lehrzeichen im Dateinamen nicht. Ersetze in diesem Fall
Code: Alles auswählen
"c:\\Programme(x86)DVDVideoSoft\\Free YouTube to MP3 Converter.exe"
durch
Code: Alles auswählen
"c:\\Programme(x86)DVDVideoSoft\\Free\ YouTube\ to\ MP3\ Converter.exe"
Zusätzlich kann es sein, dass das Programm keine Argumente von der Kommandozeile entgegennimmt. Versuche daher das Programm cmd.exe zu öffnen und gebe dort
"c:\\Programme(x86)DVDVideoSoft\\Free\ YouTube\ to\ MP3\ Converter.exe dateiname" (ohne Anführungszeichen) ein und berichte, was passiert.
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:53
von Sirius3
@jqz4n: Was sollen die zusätzlichen Backslashs im Dateinamen bewirken, außer dass das Programm garantiert nicht mehr gefunden wird. Der Vorteil von Popen ist ja gerade, dass das Commando nicht mehr mit irgendeiner Shell geparst wird.
@hsvfan521: das fehlende »\« vor DVDVideoSoft könnte aber ein Problem sein.

Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 21:58
von hsvfan521
ähm ich bin echt ein anfänger und hab absolut keine ahnung was du mit cmd.exe meinst?
Re: Hallo erstmal :)
Verfasst: Sonntag 2. Februar 2014, 22:09
von jqz4n
@Sirius3
Nun, sie könnten eine korrekte Codierung/Parsung der Lehrzeichen bewirken(schließlich wird ja der Programmname nicht in einzelne Elemente gesplittet, sondern "direkt", d.h. inkl. Lehrzeichen übertragen.) (die cmd.exe braucht sie für die grundlegende Eingabe in jedem Fall.)? Keine Ahnung, ich benutze kein Windows. Und keine Programme mit Lehrzeichen im Programmnamen.
Aber wahrscheinlich sind sie tatsächlich falsch…
Sirius3 hat geschrieben:
das fehlende »\« vor DVDVideoSoft könnte aber ein Problem sein.

bzw. das fehlende »\\«
@hsvfan521
cmd.exe ist die "Windows Eingabeaufforderung".
Vergleich Wikipedia