2012-11-09 14 views
6

Desidero aprire Esplora risorse e selezionare un file specifico. Questa è l'API: explorer /select,"PATH". Quindi con conseguente il seguente codice (usando pitone 2.7):Avvia una procedura GUI senza generare una finestra shell nera

import os 

PATH = r"G:\testing\189.mp3" 
cmd = r'explorer /select,"%s"' % PATH 

os.system(cmd) 

Il codice funziona bene, ma quando passo modalità non-shell (con pythonw), viene visualizzata una finestra guscio nero per un attimo prima l'esploratore è lanciato.

Questo è normale con os.system. Ho creato la seguente funzione per avviare processi di deposizione delle uova, senza una finestra:

import subprocess, _subprocess 

def launch_without_console(cmd): 
    "Function launches a process without spawning a window. Returns subprocess.Popen object." 
    suinfo = subprocess.STARTUPINFO() 
    suinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW 
    p = subprocess.Popen(cmd, -1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=suinfo) 
    return p 

Questo funziona bene per gli eseguibili shell senza GUI. Tuttavia non avvierà explorer.exe.

Come posso avviare il processo senza generare una finestra nera prima?

+1

sorprendente: ho provato con WinExec e ShellExec su codice C/C++ e dà il mio lo stesso comportamento. – lucasg

risposta

3

Non sembra possibile. Tuttavia è possibile accedervi dal win32api. Ho usato il codice trovato here:

from win32com.shell import shell 

def launch_file_explorer(path, files): 
    ''' 
    Given a absolute base path and names of its children (no path), open 
    up one File Explorer window with all the child files selected 
    ''' 
    folder_pidl = shell.SHILCreateFromPath(path,0)[0] 
    desktop = shell.SHGetDesktopFolder() 
    shell_folder = desktop.BindToObject(folder_pidl, None,shell.IID_IShellFolder) 
    name_to_item_mapping = dict([(desktop.GetDisplayNameOf(item, 0), item) for item in shell_folder]) 
    to_show = [] 
    for file in files: 
     if name_to_item_mapping.has_key(file): 
      to_show.append(name_to_item_mapping[file]) 
     # else: 
      # raise Exception('File: "%s" not found in "%s"' % (file, path)) 

    shell.SHOpenFolderAndSelectItems(folder_pidl, to_show, 0) 
launch_file_explorer(r'G:\testing', ['189.mp3']) 
+0

Puoi dare un'occhiata a questa domanda? grazie !!! http: //stackoverflow.com/questions/19851113/pywin32-programming-error-on-win7-with-shell-shgetdesktopfolder-desktop-bindtoob – iMath