Hallo erstmal :)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

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? :-)
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

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)
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Und einfache Backslashe in Strings zu verwenden machen nur die uncoolen Jungs.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

okay danke dir, aber so ganz verstehen tu ich es immer noch nicht...
Wo soll ich da denn eingeben welches Programm es ist?
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

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()
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

es funktioniert irgendwie nicht, syntax error und der : wird rot angezeigt?
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

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?
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

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...
Zuletzt geändert von Anonymous am Sonntag 2. Februar 2014, 21:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

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?
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

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.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@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. 8)
hsvfan521
User
Beiträge: 6
Registriert: Sonntag 2. Februar 2014, 20:23

ähm ich bin echt ein anfänger und hab absolut keine ahnung was du mit cmd.exe meinst?
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

@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. :P

Aber wahrscheinlich sind sie tatsächlich falsch…
Sirius3 hat geschrieben: das fehlende »\« vor DVDVideoSoft könnte aber ein Problem sein. 8)
bzw. das fehlende »\\« ;)

@hsvfan521

cmd.exe ist die "Windows Eingabeaufforderung". Vergleich Wikipedia
Antworten