Стартирайте GUI процес, без да създавате черен прозорец на обвивката

Искам да отворя Windows Explorer и да избера конкретен файл. Това е API: explorer /select,"PATH". Следователно в резултат на следния код (с помощта на python 2.7):

import os

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

os.system(cmd)

Кодът работи добре, но когато превключа в режим без обвивка (с pythonw), за момент се появява черен прозорец на обвивката, преди да се стартира изследователят.

Това може да се очаква с os.system. Създадох следната функция за стартиране на процеси, без да създавам прозорец:

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

Това работи добре за изпълними файлове без GUI. Въпреки това няма да стартира explorer.exe.

Как мога да стартирам процеса, без преди това да хвърля черен прозорец?


person iTayb    schedule 09.11.2012    source източник
comment
Изненадващо: Опитах с WinExec и ShellExec на C/C++ код и ми дава същото поведение.   -  person lucasg    schedule 09.11.2012


Отговори (1)


Изглежда, че не е възможно. Въпреки това може да бъде достъпен от win32api. Използвах кода, намерен тук:

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'])
person iTayb    schedule 09.11.2012
comment
Можете ли да погледнете този въпрос? благодаря !!!stackoverflow.com/questions/19851113/ - person iMath; 08.11.2013