10 行代碼,用 Python 創(chuàng)建一個 Windows 桌面快捷方式!

對于 Python 棧的小伙伴來說,miniconda 是一款非常棒的工具,它可以幫助我們快速的開啟虛擬環(huán)境,并在獨立的環(huán)境中使用特有的第三方庫,從而達(dá)到不同環(huán)境之間的隔離效果。
默認(rèn)情況下,miniconda 會盡量減少對系統(tǒng)的影響。例如,默認(rèn)安裝不會將任何 python 信息添加到操作系統(tǒng)的默認(rèn)路徑,也不需要管理員權(quán)限就可以進(jìn)行安裝。這些看起來都非常棒,但這同樣意味著我們需要執(zhí)行一些額外的步驟才能讓 Python 環(huán)境在標(biāo)準(zhǔn)的 Windows 提示符下工作,對于新手來說,并不是特別友好。
幸運的是,Anaconda (fka Continuum) 提供了啟動 powershell 或命令提示符的所有基礎(chǔ)功能,默認(rèn)安裝會創(chuàng)建一些快捷方式來做到這一點,但是,我們很難修改這些快捷方式來自定義工作目錄。
為了達(dá)到快速從某個目錄啟動 conda 的目的,我們自己創(chuàng)建一個快捷方式。
整體思路
我們一旦安裝了 miniconda,啟動 python shell 的首選方法就是使用 miniconda 的 activate.bat 文件來配置 shell 環(huán)境。在我的系統(tǒng)上(默認(rèn)安裝 miniconda),文件存儲在這里:C:/Users/luobo/AppData/Local/Continuum/miniconda3/Scripts/activate.bat 。
一般情況下,我們都不會直接在 conda 下面進(jìn)行編碼,而是會創(chuàng)建一個工作環(huán)境。
當(dāng) conda 在 Windows 上創(chuàng)建新環(huán)境時,該環(huán)境的默認(rèn)目錄位置如下所示:C:/Users/luobo/AppData/Local/Continuum/miniconda3/envs/work 。我們可以將此完整路徑傳遞給 activate.bat 文件,它會為我們啟動并自動啟動并激活工作環(huán)境。
啟動難題的最后一部分是使用 cmd.exe /K 來執(zhí)行一個 shell 命令,并返回激活環(huán)境成功的提示。
完整的命令看起來像這樣:
cmd.exe?/K?C:/Users/luobo/AppData/Local/Continuum/miniconda3/Scripts/activate.bat?C:/Users/luobo/AppData/Local/Continuum/miniconda3/envs/work
好了,上面就是我們的一個整體編碼思路了,還是比較清晰的,下面就開始吧。
特殊文件夾
從上面的描述看一看到,我們的 miniconda 文件的路徑隱藏得很深,并且這個目錄還取決于登錄用戶的個人資料。所以為了我們制作的快捷方式具有通用性,顯然是不能進(jìn)行硬編碼的。
這里我們可以使用 winshell 這個第三方庫,它提供了訪問 Windows 上特殊目錄的快捷操作方式。這樣,我們的腳本應(yīng)該可以在其他人的機(jī)器上無縫運行,并且可以跨不同版本的 Windows 運行。
import?winshell
from?pathlib?import?Path
如果我們想獲取用戶的配置文件目錄,我們可以使用文件夾功能。
profile?=?winshell.folder('profile')
Output:
'C:\\用戶\\luobo`
Winshell 提供對許多不同文件夾的訪問,這些文件夾可以通過其 CSIDL(常量特殊 ID 列表)進(jìn)行訪問。
那么通過上面的例子,我們也可以推導(dǎo)出, 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 轉(zhuǎn)換為字符串,這樣做是因為 winshell 期望它的所有輸入都是字符串,它不知道如何直接處理 pathlib 對象。
生成快捷方式
在 Windows 上使用快捷方式時,可以右鍵單擊快捷方式圖標(biāo)并查看屬性。我們大多數(shù)人可能見過這樣的事情:
Winshell 提供了一個轉(zhuǎn)儲功能,使實際的快捷方式屬性更容易查看。
例如,如果我們想查看開始菜單中現(xiàn)有的快捷方式,我們需要獲取 .lnk 文件的完整路徑,然后創(chuàng)建一個快捷方式對象并使用 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%
}
這是我們需要用來創(chuàng)建新快捷鏈接的所有信息的簡單展示。
現(xiàn)在我們知道了我們需要的信息,我們就可以創(chuàng)建自己的快捷方式了。
arg_str?=?"/K?"?+?str(miniconda_base?/?"Scripts"?/?"activate.bat")?+?"?"?+?str(miniconda_base?/?"envs"?/?"work")
我們還可以選擇傳入一個需要包含完整路徑和圖標(biāo)索引的圖標(biāo)。
在這個例子中,我使用的是 miniconda 使用的默認(rèn)圖標(biāo)。
icon?=?str(miniconda_base?/?"Menu"?/?"Iconleak-Atrous-Console.ico")
最后需要做的就是在指定的工作目錄中啟動 conda 環(huán)境。
我們假設(shè)有一個 My Documents/py_work 目錄,其中包含我們所有的 python 代碼。我們可以使用 CSIDL_PERSONAL 訪問我的文檔并構(gòu)建 py_work 的完整路徑。
my_working?=?str(Path(winshell.folder('CSIDL_PERSONAL'))?/?"py_work")
現(xiàn)在所有變量都已定義了,我們在桌面上創(chuàng)建一個快捷鏈接:
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
如果一切不出現(xiàn)意外,我們就可以在桌面上看到一個快捷方式了。
完整代碼
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


