2012-11-09 22 views
6

Chcę otworzyć Eksploratora Windows i wybrać konkretny plik. To jest API: explorer /select,"PATH". W związku z tym w wyniku następującej kodu (stosując pytona 2,7)Uruchomienie procesu GUI bez wystawiania czarnego okna powłoki

import os 

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

os.system(cmd) 

Kod działa dobrze, ale po przełączeniu trybu bez powłoki (z pythonw), wyświetlany jest czarny okna powłoki na chwilę przed badaczem jest uruchomiona.

Tego można się spodziewać z os.system. Stworzyłem następującą funkcję do uruchamiania procesów bez pojawiania się okna:

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 

Działa to dobrze w przypadku plików wykonywalnych powłoki bez GUI. Jednak nie uruchomi się explorer.exe.

Jak mogę uruchomić proces bez wcześniejszego uruchamiania czarnego okna?

+1

zaskakujące: Próbowałem z WinExec i ShellExec na C/C++ kod i daje moje takie samo zachowanie. – lucasg

Odpowiedz

3

To nie wydaje się możliwe. Jednak można go uzyskać z poziomu win32api. Użyłem kodu znalezione 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

Czy możesz rzucić okiem na to pytanie? dzięki! http: //stackoverflow.com/questions/19851113/pywin32-programming-error-on-win7-with-shell-shgetdesktopfolder-desktop-bindtoob – iMath