Запуск проводника голосовым помощником

Я написал голосового помощника на языке Python, который может рассказывать шутки, искать запрос в гугле и запускать проводник. Последнее не работает
Скорее всего, проблема в функции explorer

import speech_recognition as sr # распознавание пользовательской речи
import random2 as r # для функций farewell, toss_coin, play_greetengs
import os11 # работа с файловой системой
from googlesearch import search # для поиска в гугле
import traceback # вывод traceback без остановки работы программы при отлове исключений
import os # работа с файловой системой
import pyttsx3  # синтез речи (Text-To-Speech)
import webbrowser  # работа с использованием браузера по умолчанию (открывание вкладок с web-страницей)
import wave  # создание и чтение аудиофайлов формата wav
from tkinter import *
import tkinter # для создания оконного приложения

def setup_assistant_voice():
    """
    Установка голоса по умолчанию
    """
    voices = ttsEngine.getProperty("voices")
    # Microsoft Irina Desktop - Russian
    ttsEngine.setProperty("voice", voices[0].id)

def say(text_to_speech):
    """
    Проигрывание речи ответов голосового ассистента (без сохранения аудио)
    text_to_speech- текст, который нужно преобразовать в речь
    """
    ttsEngine.say(str(text_to_speech))
    ttsEngine.runAndWait()

def record_and_recognize_audio(*args: tuple):
    """
    Запись и распознавание аудио
    """
    with microphone:
        recognized_data = ""
        # запоминание шумов окружения для последующей очистки звука от них 
        recognizer.adjust_for_ambient_noise(microphone, duration=0.5)#запоминает первые 0,5 сек. как шум и отфильтровывает аудио от такого шума. Колибрация
        try: 
            audio = recognizer.listen(microphone, 10, 10)
            with open("microphone-results.wav", "wb") as file:
                file.write(audio.get_wav_data())# записываем сказанное пользователем в файл
        except sr.WaitTimeoutError:
            say("Проверьте, включен ли ваш микрофон")
            traceback.print_exc()
            return recognized_data
        # использование online-распознавания через Google
        try:
            recognized_data = recognizer.recognize_google(audio, language="ru-RU").lower()
        except sr.UnknownValueError:
            pass
        return recognized_data
    
def toss_coin
    a = ["орёл", "решка", "орёл", "решка", "орёл", "решка"]
    b = r.choice(a)
    if b == "орёл":
        say("орёл")
    else:
        say("решка")

def explorer(*args: tuple):
    os11.startfile("explorer")

def google(*args: tuple):
    # args- фраза поискового запроса
    if not args[0]: return
    search_term = " ".join(args[0])
    # открытие ссылки на поисковик в браузере
    url = "https://google.com/search?q=" + search_term
    webbrowser.get().open(url)

def joke(*args: tuple):
    s = ["Помыл окна - встречаю рассвет на два часа раньше.",
         "Внучок, как зовут немца, от которого я без ума? Альцгеймер, бабушка.",
         "После того, как отец проглотил флешку, дети называют его папка с файлами.",
         "Только в русском языке можно сходить вечером в кабачок заморить червячка.",
         "Программиста спрашивают: — Почему ваши дети всё время ссорятся? Программист отвечает: — Конфликт версий."]
    say(r.choice(s))

def execute_command_with_name(command_name: str, *args: list):
    command_understood = False
    for key in commands.keys():#обращаемся к ключам команд
        #say(key)
        if command_name in key:
            commands[key](*args)  # извлекаем ключ
            command_understood = True
            #say(key)
    if command_understood == False:
        say("Я вас не поняла")

def on_button_click():
    # старт записи речи с последующим выводом распознанной речи и удалением записанного в микрофон аудио
    voice_input = record_and_recognize_audio()
    #say(voice_input)
    # отделение комманд от дополнительной информации (аргументов)
    voice_input = voice_input.split(" ")
    command = voice_input[0]
    command_options = [str(input_part) for input_part in voice_input[1:len(voice_input)]]
    execute_command_with_name(command, command_options)
    if os.path.exists("microphone-results.wav"):
        os.remove("microphone-results.wav") #удаляем файл, в который записана только что сказанная речь

def window():
    w = Tk()
    w.title("Голосовой помощник 'Челси'")
    w.geometry("500x400")
    w.resizable(width=False, height=False)

    btn = tkinter.Button(text="Click me", command=on_button_click)
    btn.pack(expand=True)
    w.mainloop()

# перечень команд для использования (качестве ключей словаря используется hashable-тип tuple)
commands = { #Создаём словарь из команд. У каждого элемента словаря есть свой ключ
    ("открой проводник", "запусти проводник", "включи проводник", "проводник"): explorer,
    ("орёл", "решка", "монета", "подбрось", "монетка", "монетку"): toss_coin,
    ("загугли", "найди в гугле", "найди в интернете", "поищи в гугле", "поищи в интернете"): google,
    ("анекдот", "анекдоты", "рассмеши", "расскажи", "шутка", "шутки", "шутку"): joke
}
#слово, написанное белым шрифтом, является ключом к кортежу слева
#у ключа и названия функции должны быть одинаковые назнания, чтобы мы могли вызвать функцию

if __name__ == '__main__':
    # инициализация инструментов распознавания и ввода речи
    recognizer = sr.Recognizer()
    microphone = sr.Microphone()

    # инициализация инструмента синтеза речи
    ttsEngine = pyttsx3.init()

    setup_assistant_voice()# Настройка голоса

    window()

Ответы (1 шт):

Автор решения: mrgervant

Для начала хотелось бы обратить внимание на импорты библиотек:

import os11 # работа с файловой системой
...
import os # работа с файловой системой

Последний import os - это корректный импорт стандартной библиотеки Python для работы с ОС (документация). Первый же import os11 выглядит либо как опечатка, либо ссылка на неизвестную публике библиотеку, но именно её Вы вызываете в функции explorer().

Если это не Ваш модуль приложения, то уберите этот импорт, оставив import os.

Далее, как указал @gord1402 - можно использовать вызов explorer.exe через os.startfile:

import os

def explorer_startfile():
    os.startfile("explorer.exe")

explorer_startfile()  >>>  открывается окно "Проводник"

Вызов просто explorer возможен, но через os.system. Такой вариант может добавить гибкости, т.к. получится открывать не только стандартное окно "Проводник", но и выбранную папку:

import os

def explorer_system(path=None):
    explorer_path = ' '.join(filter(None, ["explorer", path]))
    os.system(explorer_path)

explorer_system()  >>> путь не передан, откроется стандартный "Проводник"

user_dir = os.path.expanduser("~")
explorer_system(user_dir)  >>>  передан путь до папки пользователя, откроется сразу она
→ Ссылка