Запустите процесс с графическим интерфейсом, не порождая черное окно оболочки

Я хочу открыть проводник Windows и выбрать определенный файл. Это 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

Это отлично работает для исполняемых файлов оболочки без графического интерфейса. Однако он не запустит 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