社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python爱好者社区 • 3 年前 • 422 次点击  
本文经进击的Coder(id:FightingCoder)授权转载

如若转载请联系原公众号

对于 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 命令,并返回激活环境成功的提示。

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

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 运行。

import winshell
from pathlib import Path

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

profile = winshell.folder('profile')

Output:

'C:\\用户\\luobo`

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

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

miniconda_base = Path(winshell.folder('CSIDL_LOCAL_APPDATA')) / 'Continuum' / 'miniconda3')
miniconda_base.is_dir()

Output:

True

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

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

win32_cmd = str(Path(winshell.folder('CSIDL_SYSTEM')) / 'cmd.exe')

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

生成快捷方式

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

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

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

lnk = Path(winshell.programs()) / "Anaconda3 (64-bit)" / "Anaconda Prompt (miniconda3).lnk"
shortcut = winshell.shortcut(str(lnk))
shortcut.dump()

Output:

{
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%
}

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

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

arg_str = "/K " + str(miniconda_base / "Scripts" / "activate.bat") + " " + str(miniconda_base / "envs" / "work")

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

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

icon = str(miniconda_base / "Menu" / "Iconleak-Atrous-Console.ico")

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

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

my_working = str(Path(winshell.folder('CSIDL_PERSONAL')) / "py_work")

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

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

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

完整代码

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

重磅!Python交流已成立


公众号运营至今,离不开小伙伴们的支持。
为了给小伙伴们提供一个互相交流的技术平台,特地开通了Python交流群。
群里有不少技术大神,不时会分享一些技术要点,更有一些资源收藏爱好者不时分享一些优质的学习资料。(免费,不卖课!)
需要进群的朋友,可长按扫描下方二维码。


▲长按扫码

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/123389
 
422 次点击