在windows上安装Python x64后,可以';无法从资源管理器启动脚本

在windows上安装Python x64后,可以';无法从资源管理器启动脚本,python,64-bit,Python,64 Bit,我需要为windows上的一个项目安装Python 3.6.1 x64。我卸载了3.6.1 x86并安装了3.6.1 x64。我确保路径env var指向新安装。然后,我将py文件与正确的python.exe关联: C:\ProgramFiles\Python36\python.exe 而不是: C:\ProgramFiles(x86)\Python36-32\python.exe 我可以通过调用python直接从cmd窗口运行脚本。没问题: python myscript.py 但如果我双击它

我需要为windows上的一个项目安装Python 3.6.1 x64。我卸载了3.6.1 x86并安装了3.6.1 x64。我确保路径env var指向新安装。然后,我将py文件与正确的python.exe关联: C:\ProgramFiles\Python36\python.exe 而不是: C:\ProgramFiles(x86)\Python36-32\python.exe

我可以通过调用python直接从cmd窗口运行脚本。没问题: python myscript.py

但如果我双击它会显示一个cmd windows bot,里面什么都没有

如果我“打开”它将不会加载,只需给我等待光标几秒钟。甚至在我浏览了新的python.exe之后

我错过了什么

对于Pythonx86,一切都很正常


谢谢

唉,发生了两件事。Python安装在某处出现了问题,3.6.1 x64的完全卸载和重新安装修复了常规Python执行的问题

其次,我正在使用Pywinauto,这就是为什么我需要x64来访问x64应用程序的UI。显然,它还需要提高用户权限,即管理员。因此,如果我双击一个脚本,它就会挂起,没有反馈、错误等,因为启动程序没有管理员权限

我没有注意到这一点,因为我总是从提升的cmd窗口手动执行python。如果我找到一种方法,总是以管理员的身份执行启动器,我会在这里更新

更新: 下面是一个深入的线程,介绍如何让Python提升Windows上的执行权限:

对我来说,编写Powershell脚本来完成这项工作要容易得多:

# ========================================= Admin Rights =======================================================
function asAdmin
{
    [string]$cmdPath = $args[0]
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$cmdPath`"" -Verb RunAs; exit }
}

asAdmin $PSCommandPath

Start-Process "pythonw" "$PSScriptRoot\myPythonScriptWithUI.pyw"

在控制面板“默认程序”对话框中,用于设置文件关联,确保.pyfile与Python软件基金会中的“Python”相关联,并描述“Python文件”。图标应该有Python徽标,如果您安装了py launcher,可能会有一个火箭。是的,它与launcher关联(Python图标和火箭)。我刚刚完全卸载了3.6.1 x64,手动删除了所有python安装文件夹并重新安装了x64。我得到同样的东西。启动程序(py.exe)似乎有问题,而不是python。您的意思是希望某个特定脚本以提升方式执行,还是始终希望py.exe以提升方式运行?后者可以通过在py.exe的兼容性属性中强制以管理员身份运行来实现。在引擎盖下,这将在
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
中设置为一个值,其中包含可执行文件的完整路径和数据
~RUNASADMIN
。如果是前者,脚本可以使用“runas”动词
ShellExecuteEx
本身。使用“Ex”版本而不是
ShellExecute
来获取进程句柄。然后调用
WaitForSingleObject
等待提升的实例退出,并
GetExitCodeProcess
将其退出代码代理为您自己的。您可以通过PyWin32或ctypes或自定义扩展模块调用这些函数。只需特定的脚本即可。是的,我在这里看到了一个关于让Python脚本以管理员的身份运行自己的线程,但对我来说,让一个launcher Powershell脚本执行与启动Python相同的操作要容易得多。