踩坑示范与本文起因(错误尝试)
在用python做程序开发时, 我本以为创建Windows桌面快捷方式是一件很容易的事情;
首先为了创建快捷方式, 我首先想到的是调用Windows Scripting Host(WSH)中的Shell对象;
于是事情就分四步: 获取桌面快捷路径, 定义目标, 定义工作目录, 最后创建一个.lnk格式文件;
于是就有了第一次踩坑尝试:
错误代码示例
import os
import sys
from win32com import client
#安装第三方库:pip install pywin32
def create_shortcut(target_path, shortcut_path):
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut(shortcut_path)
shortcut.Targetpath = target_path #目标程序路径
shortcut.WorkingDirectory = os.path.dirname(target_path) #工作路径
shortcut.IconLocation = target_path #图标路径
shortcut.save()
if __name__ == "__main__":
target_path = sys.executable
#获取桌面路径并和快捷方式拼接(但是这样会出现一个问题,下文再说)
shortcut_path = os.path.join(os.path.expanduser("~"), "Desktop", "快捷方式.lnk")
create_shortcut(target_path, shortcut_path)
错误原因
我写完后测试了一下,结果是一大片报红;
然后经排查,是快捷方式路径中的桌面路径不对;
os.path.join(os.path.expanduser("~"), "Desktop", "快捷方式.lnk")---这里用的是Windows系统默认的桌面路径;
但是我忘了一件事,我在很久之前就修改了我的桌面路径,所以我的桌面压根就不叫Desktop;
然后我就发现,这样写快捷方式路径也是不合理的,不能说每一个程序用户的桌面路径都用默认的Desktop吧(反正我的就不是╮(╯-╰)╭);
本文起因
于是呢,就需要确保程序能不依赖这种用字符串定义的方式获取桌面路径;
所以我想,Windows系统中一定有什么方式记录着桌面的路径,或者决定了桌面路径,所以应当直接用Windows的API就可以获取到桌面路径 ;
然后我就开始翻阅资料,当时在网上翻了一下午,终于 --- 没翻到😂;
然后我去看Windows的官方文档,琢磨了差不多一个礼拜,才解决了这个问题(虽然那一个礼拜里我也要上课,但根本没想到这么耗时啊喂!(*  ̄︿ ̄)#);
于是就有了这篇文章的诞生;
正确处理方式
正确代码示例(可用的完整代码)
import ctypes
from ctypes import wintypes
from win32com.client import Dispatch
#是的没错,还是pywin32
#还用了ctypes标准库,用于调用Windows的API
#获取桌面路径
def get_desktop_path():
CSIDL_DESKTOP = 0x0000
SHGFP_TYPE_CURRENT = 0
buffer = ctypes.create_unicode_buffer(wintypes.MAX_PATH)
#创建Unicode缓冲区
ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_DESKTOP, None, SHGFP_TYPE_CURRENT, buffer)
#调用Windows的API来获取桌面路径
desktop_path = buffer.value
#将将缓冲区的值,赋给变量desktp_path
return desktop_path
#创建桌面快捷方式
def create_shortcut(path, target, work_Dir, icon=''):
shell = Dispatch('WScript.Shell')
shortcut = shell.CreateShortCut(path)
shortcut.TargetPath = target
shortcut.WorkingDirectory = work_Dir
#shortcut.IconLocation = icon --这是用来定义图标路径的,没有图标就不要了(icon参数:图标路径)
shortcut.Save()
shortcut_path = get_desktop_path()+r'\快捷方式.lnk'
target_path = os.getcwd()+r"\程序名称.exe" #.exe是因为最后这个py脚本要打包成exe
work_dir = os.getcwd() #工作目录,就是快捷方式属性中的起始位置
creat_shortcut(shortcut_path, target_path, work_Dir)
代码解释
创建快捷方式的函数就不说了,基础操作;
主要解释一下桌面路径的获取:
CSIDL_DESKTOP = 0x0000 --声明要获取的文件夹类型;
SHGFP_TYPE_CURRENT = 0 --声明要获取的是当前用户桌面路径;
buffer = ctypes.create_unicode_buffer(wintypes.MAX_PATH) --创建一个Unicode缓冲区,用来存储桌面路径;
ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_DESKTOP, None, SHGFP_TYPE_CURRENT, buffer) --这个就有点复杂了;SHGetFolderPathW函数需要传递5个参数:
1.第一个参数:窗口句柄,用来制定调用该函数的窗口,这里直接用None表示不需要父窗口;
2.第二个参数:要获取的文件夹类型标识符,这里 CSIDL_DESKTOP=0x0000 表示桌面;
3.第三个参数:UI界面,None表示不需要显示UI(老实说,这个参数我也没搞懂);
4.第四个参数:标志位,用于控制函数的行为,这里 SHGFP_TYPE_CURRENT = 0 表示获取当前用户的文件夹路径;
5.第五个参数:指向接收文件路径的缓冲区,这里就是刚刚创建的缓冲区buffer;
然后桌面路径就存在这个buffer里面了;
desktop_path = buffer.value --将buffer里面的值,赋给变量desktop_path;
本文到此结束,如果有不对或者有疑问的地方,欢迎在评论区发言(〃 ̄︶ ̄)人( ̄︶ ̄〃);
ps:小白过坑,不喜勿喷.