前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10 行代码,用 Python 创建一个 Windows 桌面快捷方式!

10 行代码,用 Python 创建一个 Windows 桌面快捷方式!

作者头像
崔庆才
发布2021-10-20 16:40:25
3.3K0
发布2021-10-20 16:40:25
举报
文章被收录于专栏:进击的Coder进击的Coder

这是「进击的Coder」的第 490 篇技术分享

作者:周萝卜

对于 Python 栈的小伙伴来说,miniconda 是一款非常棒的工具,它可以帮助我们快速的开启虚拟环境,并在独立的环境中使用特有的第三方库,从而达到不同环境之间的隔离效果。

默认情况下,miniconda 会尽量减少对系统的影响。例如,默认安装不会将任何 python 信息添加到操作系统的默认路径,也不需要管理员权限就可以进行安装。这些看起来都非常棒,但这同样意味着我们需要执行一些额外的步骤才能让 Python 环境在标准的 Windows 提示符下工作,对于新手来说,并不是特别友好。

幸运的是,Anaconda (fka Continuum) 提供了启动 powershell 或命令提示符的所有基础功能,默认安装会创建一些快捷方式来做到这一点,但是,我们很难修改这些快捷方式来自定义工作目录。

为了达到快速从某个目录启动 conda 的目的,我们自己创建一个快捷方式。

整体思路

我们一旦安装了 miniconda,启动 python shell 的首选方法就是使用 miniconda 的 activate.bat 文件来配置 shell 环境。在我的系统上(默认安装 miniconda),文件存储在这里:C:/Users/luobo/AppData/Local/Continuum/miniconda3/Scripts/activate.bat 。

一般情况下,我们都不会直接在 conda 下面进行编码,而是会创建一个工作环境。

当 conda 在 Windows 上创建新环境时,该环境的默认目录位置如下所示:C:/Users/luobo/AppData/Local/Continuum/miniconda3/envs/work 。我们可以将此完整路径传递给 activate.bat 文件,它会为我们启动并自动启动并激活工作环境。

启动难题的最后一部分是使用 cmd.exe /K 来执行一个 shell 命令,并返回激活环境成功的提示。

完整的命令看起来像这样:

代码语言:javascript
复制
cmd.exe /K C:/Users/luobo/AppData/Local/Continuum/miniconda3/Scripts/activate.bat C:/Users/luobo/AppData/Local/Continuum/miniconda3/envs/work

好了,上面就是我们的一个整体编码思路了,还是比较清晰的,下面就开始吧。

特殊文件夹

从上面的描述看一看到,我们的 miniconda 文件的路径隐藏得很深,并且这个目录还取决于登录用户的个人资料。所以为了我们制作的快捷方式具有通用性,显然是不能进行硬编码的。

这里我们可以使用 winshell 这个第三方库,它提供了访问 Windows 上特殊目录的快捷操作方式。这样,我们的脚本应该可以在其他人的机器上无缝运行,并且可以跨不同版本的 Windows 运行。

代码语言:javascript
复制
import winshell
from pathlib import Path

如果我们想获取用户的配置文件目录,我们可以使用文件夹功能。

代码语言:javascript
复制
profile = winshell.folder('profile')

Output:

代码语言:javascript
复制
'C:\\用户\\luobo`

Winshell 提供对许多不同文件夹的访问,这些文件夹可以通过其 CSIDL(常量特殊 ID 列表)进行访问。

那么通过上面的例子,我们也可以推导出, minicodan 的目录。

代码语言:javascript
复制
miniconda_base = Path(winshell.folder('CSIDL_LOCAL_APPDATA')) / 'Continuum' / 'miniconda3')
miniconda_base.is_dir()

Output:

代码语言:javascript
复制
True

可以看到,通过测试,我们拿到的路径是正确的。

我们需要的另一个位置是 cmd.exe,我们可以通过 CSIDL_SYSTEM 获得它。

代码语言:javascript
复制
win32_cmd = str(Path(winshell.folder('CSIDL_SYSTEM')) / 'cmd.exe')

注意到我们使用 str 将 Path 转换为字符串,这样做是因为 winshell 期望它的所有输入都是字符串,它不知道如何直接处理 pathlib 对象。

生成快捷方式

在 Windows 上使用快捷方式时,可以右键单击快捷方式图标并查看属性。我们大多数人可能见过这样的事情:

Winshell 提供了一个转储功能,使实际的快捷方式属性更容易查看。

例如,如果我们想查看开始菜单中现有的快捷方式,我们需要获取 .lnk 文件的完整路径,然后创建一个快捷方式对象并使用 dump 显示值。

代码语言:javascript
复制
lnk = Path(winshell.programs()) / "Anaconda3 (64-bit)" / "Anaconda Prompt (miniconda3).lnk"
shortcut = winshell.shortcut(str(lnk))
shortcut.dump()

Output:

代码语言:javascript
复制
{
C:\Users\luobo\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Anaconda3 (64-bit)\Anaconda Prompt (miniconda3).lnk -> C:\Windows\System32\cmd.exe

arguments: "/K" C:\Users\luobo\AppData\Local\Continuum\miniconda3\Scripts\activate.bat C:\Users\luobo\AppData\Local\Continuum\miniconda3
description: Anaconda Prompt (miniconda3)
hotkey: 0
icon_location: ('C:\\Users\\luobo\\AppData\\Local\\Continuum\\miniconda3\\Menu\\Iconleak-Atrous-Console.ico', 0)
path: C:\Windows\System32\cmd.exe
show_cmd: normal
working_directory: %HOMEPATH%
}

这是我们需要用来创建新快捷链接的所有信息的简单展示。

现在我们知道了我们需要的信息,我们就可以创建自己的快捷方式了。

代码语言:javascript
复制
arg_str = "/K " + str(miniconda_base / "Scripts" / "activate.bat") + " " + str(miniconda_base / "envs" / "work")

我们还可以选择传入一个需要包含完整路径和图标索引的图标。

在这个例子中,我使用的是 miniconda 使用的默认图标。

代码语言:javascript
复制
icon = str(miniconda_base / "Menu" / "Iconleak-Atrous-Console.ico")

最后需要做的就是在指定的工作目录中启动 conda 环境。

我们假设有一个 My Documents/py_work 目录,其中包含我们所有的 python 代码。我们可以使用 CSIDL_PERSONAL 访问我的文档并构建 py_work 的完整路径。

代码语言:javascript
复制
my_working = str(Path(winshell.folder('CSIDL_PERSONAL')) / "py_work")

现在所有变量都已定义了,我们在桌面上创建一个快捷链接:

代码语言:javascript
复制
link_filepath = str(desktop / "python_working.lnk")
with winshell.shortcut(link_filepath) as link:
    link.path = win32_cmd
    link.description = "Python(work)"
    link.arguments = arg_str
    link.icon_location = (icon, 0)
    link.working_directory = my_working

如果一切不出现意外,我们就可以在桌面上看到一个快捷方式了。

完整代码

代码语言:javascript
复制
import winshell
from pathlib import Path

# Define all the file paths needed for the shortcut
# Assumes default miniconda install
desktop = Path(winshell.desktop())
miniconda_base = Path(
    winshell.folder('CSIDL_LOCAL_APPDATA')) / 'Continuum' / 'miniconda3'
win32_cmd = str(Path(winshell.folder('CSIDL_SYSTEM')) / 'cmd.exe')
icon = str(miniconda_base / "Menu" / "Iconleak-Atrous-Console.ico")

# This will point to My Documents/py_work. Adjust to your preferences
my_working = str(Path(winshell.folder('CSIDL_PERSONAL')) / "py_work")
link_filepath = str(desktop / "python_working.lnk")

# Build up all the arguments to cmd.exe
# Use /K so that the command prompt will stay open
arg_str = "/K " + str(miniconda_base / "Scripts" / "activate.bat") + " " + str(
    miniconda_base / "envs" / "work")

# Create the shortcut on the desktop
with winshell.shortcut(link_filepath) as link:
    link.path = win32_cmd
    link.description = "Python(work)"
    link.arguments = arg_str
    link.icon_location = (icon, 0)
    link.working_directory = my_working

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击的Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整体思路
  • 特殊文件夹
  • 生成快捷方式
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档