我希望 Windows 上的某些 Python 脚本具有自定义图标,其文件名文本位于标题栏中,并且我希望它们可以固定在任务栏和开始菜单中。我发现最简单的方法是编译一个只运行 Python 脚本的 exe 文件。
这具有我上述所有优点,同时还不必每次编辑 Python 脚本时都重新编译 exe。我使用 PS2Exe 实现了这一点。例如,这是我的编译脚本:
Invoke-PS2EXE "runPythonFile.ps1" "output.exe" -iconFile icons/myIconFile.ico
以下是调用 Python 文件(名为 )的 PS1 脚本runPythonFile.ps1
:
Set-Location $PSScriptRoot
./myPythonFile.py arg1 arg2
Read-Host -Prompt 'Press enter to exit'
这样做有两个不良的副作用:
- 如果我
colorama
在 Python 中使用彩色打印文本,运行output.exe
文件不会打印任何颜色。 - 如果我
input
在 Python 中使用该函数,则输入文本提示直到按下回车键后才会显示。
说明这两个问题的示例 Python 脚本:
from colorama import Fore, Back, Style
import colorama
colorama.init()
print(Style.BRIGHT + Fore.GREEN + "Howdy")
print(Style.BRIGHT + Fore.WHITE + "Done")
result = input("Please enter your pin number: ")
print(result)
这是一个简短视频演示两个问题(它们彼此独立)。请注意,当我运行 exe 时,我必须在提示出现之前输入输入值,但直接运行 Python 脚本时,我必须在提示出现之后输入输入值。还请注意,当我运行 exe 时,“Howdy”消息不是绿色的,但当我运行 Python 脚本时,它是绿色的。
有简单的解决方案吗?我喜欢有一个 exe 文件,它只调用 Python 脚本,以实现我在开头提到的好处,但我不喜欢它阻止我使用颜色并弄乱输入功能。有什么建议吗?
答案1
这是因为您正在使用$PsScriptRoot
变量。请尝试使用以下代码。
if ($MyInvocation.MyCommand.CommandType -eq "ExternalScript"){
$ScriptPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
}
else {
$ScriptPath = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0])
if (!$ScriptPath){
$ScriptPath = Get-Location
}
}
$ScriptPath
并在脚本中使用变量。