2013-01-15 19 views
5

Sto provando a chiamare un eseguibile all'avvio, che chiamerà un altro eseguibile. Per la prima parte, ho semplicemente aggiunto il percorso dell'eseguibile a HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, che funziona, il mio eseguibile viene chiamato all'avvio.Subprocess.Popen(): nascondi la shell cmd

Quest'ultimo contiene, tra gli altri, queste linee:

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

Tuttavia, una shell di comando (cmd) Pops all'avvio del computer. Tutto funziona bene, ma è visibile invece che nascosto ... Quindi, in pratica, come posso nascondere questo comando shell?

Quando si utilizza ProcessExplorer, ho la seguente gerarchia:

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

Ecco la sequenza che cerco di ottenere:

  • creo un file ISO contenente tutte le Python eseguibile voglio correre sulla VM. Uno di essi (master.exe) chiama gli altri.
  • creo una macchina virtuale, che monta automaticamente quest'ultimo
  • La VM, che è stata preparata, ha un'attività pianificata che richiede D:\master.exe
  • master.exe (tra gli altri compiti che non sono la nostra preoccupazione qui) aggiunge il valore D:\myscript.exe-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • La VM si riavvia
  • D:\myscript.exe viene eseguito (e funziona correttamente e come richiesto), ma viene eseguito in un prompt dei comandi, che mi piacerebbe essere invisibile.
+0

Come regola generale, per nascondere una finestra di processo, corro via VBScript (metodo .run). Ma sembra, python ti offre un modo nativo. :-) – anishsane

+0

correlati: [Come nascondere la console quando utilizzo os.system() o subprocess.call()?] (Http://stackoverflow.com/q/7006238/4279) – jfs

risposta

3

Questo è un problema tipico che i programmatori Python incontrano e pertanto una soluzione è offerta da Python stesso. È stato chiesto tante volte, ad es., here, ma per te il problema è un po 'più complicato.

Si tratta di utilizzare python.exe o pythonw.exe per eseguire lo script. Per il primo, viene aperta una console, mentre per il secondo non lo è.

Mentre si utilizzano gli script compilati, è necessario indicare al compilatore quale versione si desidera utilizzare. Supponendo che stai usando py2exe, puoi dare un'occhiata allo this post on SO. Qui è spiegato in dettaglio come procedere.

+0

Questo è valido solo per la finestra della console coinvolta con il processo python (che mostra le informazioni di debug ecc.). Non è correlato all'apertura di un sottoprocesso relativo alla console con Popen. Testato già molte volte. L'unica cosa che puoi fare è lavorare con SHELL = True flag con lo svantaggio di non avere alcun controllo sulle eccezioni/errori provenienti dal sottoprocesso. Non otterrai alcuna informazione. Ad esempio se il sottoprocesso non viene caricato a causa del fatto che il sistema non riesce a trovare l'exe su disco, il sistema non lo dirà. Non molto utile. – Jomme

1

La finestra della console che viene aperta probabilmente appartiene al processo Python che esegue lo script. Mostraci la voce nel registro che esegue il tuo script.

+2

@NNzz Qual è il valore di 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run' che esegue il primo eseguibile? Per favore descrivi esattamente quali tipi di eseguibili hai; sono script Python o script Python compilati o una combinazione? –

+0

Sono script Python che ho compilato in un eseguibile. Il valore della chiave è 'D: \ myscript.exe', che è la posizione effettiva dell'eseguibile che voglio eseguire. Aggiungerò alcune informazioni al mio post per essere più precisi. –

0

Se si esegue un programma di console, Windows creerà una finestra di console. "python.exe" è un programma di console.

Se non si desidera una finestra della console, è possibile eseguire lo script Python con "pythonw.exe" anziché con "python.exe".

0

È possibile compilarlo in formato exe. Quando ho riscontrato il problema, ho utilizzato py2exe per compilare il file python in eseguibile invisibile.

Tutto quello che dovete fare è cambiare la configurazione.file di py (utilizzato per la compilazione), da

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

a

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