Seite 1 von 1

os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 08:59
von twessels
Hi,
ich verwende os.system() um ein PDF aus meinem Programm aufzurufen.
Das ganze sieht so aus:

Code: Alles auswählen

	def showManual(self):
		try:
			os.system("..\doc\Manual.pdf")
		except OSError, e:
			self.statusBar().showMessage("Couldn't open Manual.pdf", 5000)
Der große Vorteil hier ist, ich brauche auf dem System nicht nach einem PDF-Betrachter zu suchen. Subprocess will den ja haben als erstes Argument. Nachteil: Meine GUI hängt, solange das Manual geöffnet ist.

Irgendwelche Ideen? :wink:

Gruß

Re: os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 09:20
von BlackJack
@twessels: Datendateien ”starten” ist abhängig vom Betriebssystem. Damit es unabhängig wird, würde ich das desktop-Modul vorschlagen.

Re: os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 11:00
von LivingOn
grundsätzlich ist BlackJacks Vorschlag vorzuziehen, aber als Quick & Dirty-Lösung und da Du ja anscheinend Windows benutzt, versuche mal folgendes:

os.system("start ..\doc\Manual.pdf")

Re: os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 11:57
von cofi
Wenn wirklich nur Windows im Blick ist, dann eher `os.startfile`: http://docs.python.org/library/os.html#os.startfile

Re: os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 12:30
von twessels
cofi hat geschrieben:Wenn wirklich nur Windows im Blick ist, dann eher `os.startfile`: http://docs.python.org/library/os.html#os.startfile
Danke funktioniert! Das desktop modul gucke ich mir auch mal an

Re: os.system() durch subprocess.Popen() ersetzen

Verfasst: Mittwoch 13. Juli 2011, 17:42
von lunar
@twessels: Falls es sich – wie ich angesichts der Methodennamen vermute – um eine Qt-Anwendung handelt, kannst Du auch "QtGui.QDesktopServices.openUrl()" verwenden.

Selbst wenn dem nicht so ist, benötigt man keine zusätzliche Abhängigkeit:

Code: Alles auswählen

def open_file(filename):
    filename = os.path.normpath(filename)
    if hasattr(os, 'startfile'):
        os.startfile(os.path.normpath(filename))
    else:
        executable = 'open' if os.name == 'mac' else 'xdg-open'
        subprocess.Popen([executable, filename])
Vom "desktop"-Modul rate ich ab. Dass der Link auf der PyPI-Seite ins Nichts führt und das Projekt auf der Website insgesamt gar nicht mehr erwähnt wird, lässt vermuten, dass es nicht mehr gewartet wird. Bestenfalls tut es eh nur dasselbe wie obige Funktion.