2013-01-15 6 views
5

Ich versuche, eine ausführbare Datei beim Start aufzurufen, die eine andere ausführbare Datei selbst aufrufen wird. Für den ersten Teil habe ich einfach den Pfad zur ausführbaren Datei HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run hinzugefügt, was funktioniert, meine ausführbare Datei wird beim Start aufgerufen.Subprocess.Popen(): verstecken Sie die Shell cmd

Letztere enthält unter anderem die folgenden Zeilen:

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
startupinfo.wShowWindow = subprocess.SW_HIDE 
proc = subprocess.Popen(command, startupinfo=startupinfo) 

jedoch eine Eingabeaufforderung (CMD) erscheint, wenn der Computer gestartet wird. Alles funktioniert gut, aber es ist sichtbar statt versteckt ... Also, wie verberge ich diese Kommandozeile?

Wenn ProcessExplorer mit, ich habe die folgende Hierarchie:

+ System 
|_ Interrupts 
|_ smss.exe 
    |_ some processes... 
+ explorer.exe 
    |_ some processes... 
|_ MYSCRIPT.EXE 

Dies ist die Folge ich versuche zu erreichen:

alle
  • Ich erstelle eine ISO-Datei enthält, die Python-Executable I ausgeführt werden soll auf der VM. Einer von ihnen (master.exe) ruft die anderen an.
  • ich eine VM erstellen, die automatisch die letztere
  • Die VM montieren, die vorbereitet wurde, hat eine geplante Aufgabe, die D:\master.exe
  • master.exe (unter anderen Aufgaben, die hier nicht unsere Sorge sind) nennt addiert den Wert D:\myscript.exe-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • Die VM wird neu gestartet
  • D:\myscript.exe wird ausgeführt (und es funktioniert gut und wie besucht), aber es wird in einer Eingabeaufforderung ausgeführt, die ich gerne unsichtbar sein würde.
+0

Als allgemeine Regel gilt, ein Prozessfenster zu verbergen, ich laufe es über vbscript (.run Methode). Aber Python bietet Ihnen einen nativen Weg. :-) – anishsane

+0

verwandt: [Wie verbirg ich die Konsole, wenn ich os.system() oder subprocess.call() verwende?] (Http://stackoverflow.com/q/7006238/4279) – jfs

Antwort

3

Dies ist ein typisches Problem, mit dem Python-Programmierer konfrontiert sind - und daher bietet Python selbst eine Lösung an. Es wurde SO oft gefragt, z. B. here, aber für Sie ist das Problem ein wenig komplizierter.

Es geht darum, ob Sie python.exe oder pythonw.exe verwenden, um Ihr Skript auszuführen. Für den ersten ist eine Konsole geöffnet, für den zweiten ist es nicht.

Wenn Sie kompilierte Skripte verwenden, müssen Sie dem "Compiler" mitteilen, welche Version Sie verwenden möchten. Angenommen, Sie verwenden py2exe, können Sie sich ansehen this post on SO. Hier wird detailliert erklärt, wie es weitergeht.

+0

Dies gilt nur für das Konsolenfenster, das mit dem Python-Prozess zu tun hat (der Debug-Informationen anzeigt usw.). Es hängt nicht mit dem Öffnen eines konsolenbezogenen Subprozesses mit Popen zusammen. Getestet schon viele Male. Das einzige, was Sie tun können, ist die Arbeit mit dem Flag SHELL = True, mit dem Nachteil, dass Sie keine Kontrolle über Exceptions/Fehler bekommen, die vom Subprozess kommen. Sie werden überhaupt keine Informationen erhalten. Zum Beispiel, wenn der Unterprozess nicht geladen wird, weil das System die exe auf dem Datenträger nicht finden kann, wird das System es Ihnen nicht sagen. Nicht sehr praktisch. – Jomme

1

Das Konsolenfenster, das geöffnet wird, gehört wahrscheinlich zu dem Python-Prozess, der Ihr Skript ausführt. Zeigen Sie uns den Eintrag in der Registrierung, in dem Ihr Skript läuft.

+2

@NNzz Was ist der Wert von 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run' läuft Ihre erste ausführbare Datei? Bitte beschreiben Sie genau, welche Arten von ausführbaren Dateien Sie haben; Sind das Python-Skripte oder kompilierte Python-Skripte oder eine Kombination daraus? –

+0

Sie sind Python-Skripte, die ich in eine ausführbare Datei kompiliert habe. Der Wert des Schlüssels ist 'D: \ myscript.exe', was der tatsächliche Speicherort der ausführbaren Datei ist, die ich ausführen möchte. Ich werde meinem Beitrag einige Informationen hinzufügen, um genauer zu sein. –

0

Wenn Sie ein Konsolenprogramm ausführen, erstellt Windows ein Konsolenfenster. "python.exe" ist ein Konsolenprogramm.

Wenn Sie kein Konsolenfenster möchten, können Sie Ihr Python-Skript mit "pythonw.exe" anstelle von "python.exe" ausführen.

0

Sie können es in EXE-Format kompilieren. Wenn ich auf dieses Problem stoße, habe ich py2exe verwendet, um Python-Datei zu unsichtbaren ausführbaren zu kompilieren.

Alles, was Sie tun müssen, ist das Setup zu ändern.py-Datei (zur kompilieren), von

setup(console=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 

zu

setup(windows=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 
Verwandte Themen