вторник, 30 октября 2012 г.

Создаём ярлыки при помощи Python (Перевод)


На работе часто приходится заниматься системным администрированием и для этого я использую скрипты на Python. Например, почти все скрипты входа в систему написаны на Python (некоторые из них портированы с Kixtart). В течении этого года мне пришлось заниматься созданием ярлыков для новых приложений, которые должны быть расположены на рабочем столе, в меню "все программы" или и там и там. В этой статье я расскажу о том, как решить эту проблему.
Обратите внимание, эта статья касается только Windows!!!

Первое, что Вам понадобится для работы с Windows - библиотека PyWin32 Mark Hammond’а (AKA: Python для Windows). Я так же рекомендую модуль модуль Tim Golden’а winshell, так как он может сильно облегчить поиск специфических папок пользователя. Я буду использовать Python 2.5, но как я понимаю, PyWin32 совместим и с Python 3, так что эта статья может быть применима и к нему.
Самая простая задача - создать веб-ссылку на рабочем столе пользователя. До тех пор, пока Вам не нужно указывать специфический браузер, это и правда простая задача:
import os, winshell
 
desktop = winshell.desktop()
path = os.path.join(desktop, "myNeatWebsite.url")
target = "http://www.google.com/"
 
shortcut = file(path, 'w') # это из версии 2.х
shortcut.write('[InternetShortcut]\n')
shortcut.write('URL=%s' % target)
shortcut.close()
В этом коде мы импортируем модули os и winshell. Мы используем winshell для получения пути к рабочему столу текущего пользователя и os.path.join() для соединения пути и имени ярлыка. Так как мы говорим только про Windows, на самом деле об этом можно не волноваться и сделать это вручную при помощи конкатенации строк. Обратите внимание, что расширением должно быть “.url”, чтобы Windows знал что делать. Затем мы пишем в файл по полученному пути и в качестве первой строки записываем [InternetShortcut]. Во второй строке мы записываем адрес ссылки, закрываем файл и всё!
Следующий пример будет немного сложнее. В нём мы воспользуемся модулем win32com из библиотеки PyWin32 для создания ярлыка для Media Player Classic, опенсорсного плеера. Давайте посмотрим на нужный для этого код:
import os, winshell
from win32com.client import Dispatch
 
desktop = winshell.desktop()
path = os.path.join(desktop, "Media Player Classic.lnk")
target = r"P:\Media\Media Player Classic\mplayerc.exe"
wDir = r"P:\Media\Media Player Classic"
icon = r"P:\Media\Media Player Classic\mplayerc.exe"
 
shell = Dispatch('WScript.Shell')
shortcut = shell.CreateShortCut(path)
shortcut.Targetpath = target
shortcut.WorkingDirectory = wDir
shortcut.IconLocation = icon
shortcut.save()
Главное здесь - часть работы с шеллом. Во первых, Вы импортируете  Dispatch из win32com.client, потом вызываете Dispatch(‘WScript.Shell’) для получения объекта шелла (типа того) который Вы будете затем использовать для создания ярлыка. После того, как Вы это сделаете, Вы можете задать атрибуты ярлыка, а именно Targetpath (путь к файлу, который должен быть запущен при помощи ярлыка), WorkingDirectory (рабочая директория) and IconLocation (место расположения иконки). Обратите внимание, WorkingDirectory соответствует полю “Start In” в окне свойств ярлыка. В скрипте IconLocation может быть файлом иконки или иконка может быть извлечена непосредственно из исполняемого файла. Учтите, что если Вы не вызовите в конце save, то иконка (ярлык?) не будет создан. В этом скрипте мы явно не вызываем close для объекта, так как Python сам сделает это за нас при завершении скрипта.
Теперь давайте воспользуемся этими двумя примерами и создадим функцию, которую потом можно будет использовать в скриптах входа в систему:
from win32com.client import Dispatch
 
def createShortcut(path, target='', wDir='', icon=''):    
    ext = path[-3:]
    if ext == 'url':
        shortcut = file(path, 'w')
        shortcut.write('[InternetShortcut]\n')
        shortcut.write('URL=%s' % target)
        shortcut.close()
    else:
        shell = Dispatch('WScript.Shell')
        shortcut = shell.CreateShortCut(path)
        shortcut.Targetpath = target
        shortcut.WorkingDirectory = wDir
        if icon == '':
            pass
        else:
            shortcut.IconLocation = icon
        shortcut.save()
Одно из улучшений, которое мы можем применить здесь - использовать метод os.path.dirname для получения рабочего каталога из текущего и избавиться от необходимости передавать о нём информацию. Конечно, я видел и такие ярлыки, где рабочий каталог вообще не был указан!
Надеюсь, Вам поможет эта статья. До скорых встреч!

Комментариев нет:

Отправить комментарий