Python 3.x 拖放在 Windows 中损坏

Posted

技术标签:

【中文标题】Python 3.x 拖放在 Windows 中损坏【英文标题】:Python 3.x Drag-And-Drop Broken in Windows 【发布时间】:2020-02-03 04:44:09 【问题描述】:

以前,我安装了 Python 3.7.4,并且在 Win10 上运行良好。然后,第 3 方安装程序(我不知道)安装了 Python 2.7 ......这完全淹没了我的 Python 环境(呃)。在删除 Python 2.7 并运行 Python 3.7.4 的修复重新安装后,它大部分都可以备份并运行 - 除了能够拖放到 .py 文件上。

每个Drag and drop onto Python script in Windows Explorer 和Python Drag-and-drop broken,我都试过了:

注册:

HKCR\.py=Python.File (when I first checked, it was set to py_auto_file, so I did have to change this)
HKCR\Python.File\shell\open\command="C:\Users\xxx\AppData\Local\Programs\Python\Python37-32\python.exe" "%1"
HKCR\Python.File\shellex\DropHandler= I've tried 60254CA5-953B-11CF-8C96-00AA00B8708C, 86C86720-42A0-1069-A2E8-08002B30309D, and BEA218D2-6950-497B-9434-61683EC065FE

通过上述更改,我能够在拖放到 .py 文件时启动 Python,但 sys.argv 不包含文件名(仅设置了 argv[0],而不是 argv[1] )。显然,我在每次测试之间重新启动 Windows 资源管理器。在过去的几个小时里,我一直在搜索和阅读,但我发现的所有内容几乎都包含上述 3 项更改的一些变体。

任何想法为什么通过将文件拖到 .py 脚本启动 Python 时不会设置 argv[1]?

【问题讨论】:

首先在“HKCU\Software\Classes”和“HKLM\Software\Classes”中检查“Python.File”。 (切勿通过“HKCR”修改密钥。)确保“shellex\DropHandler”的默认值为“BEA218D2-6950-497B-9434-61683EC065FE”(如果已定义)。接下来修复您的安装,并确保选择了安装启动器 (py.exe) 并将其与脚本关联的选项。后者将启动器设置为“Python.File\shell\open\command”。 最后,让这个 progid 成为您在 Windows shell 中的用户选择,它可以控制右键单击操作和放置处理程序。为此,请右键单击 .py 文件并选择“打开方式”->“选择另一个应用程序”。选择上面带有火箭的 Python 图标和“始终使用此应用打开 .py 文件”选项。 如果您好奇或需要验证 drop-handler 设置,您可以检查“HKCR\CLSID\BEA218D2-6950-497B-9434-61683EC065FE\InprocServer32”。这是加载到托管 Windows shell(例如 explorer.exe)的进程中的 shell 扩展 DLL。对于 64 位系统,它应该是“pyshellext.amd64.dll”的路径。 你的“HKLM\Software\Classes\Python.File\shell\open\command”是什么?如果为所有用户安装了启动器,则应为"%SystemRoot%\py.exe" "%1" %*,其中SystemRoot 通常为“C:\Windows”。有时“%1”被替换为“%L”(很久以前它们的行为不同,但现在它们是等价的)。 %* 用于命令行参数。在手动更改之前,请尝试修复“Python Launcher”安装。这应该可以修复命令,如果它是错误的,使用启动器的安装路径。 在写之前我确实确认修复“Python Launcher”安装修复了打开命令。请注意,启动器安装与已安装程序列表中的 Python 安装是分开的。 【参考方案1】:

鉴于是windows,你试过重启吗?

【讨论】:

【参考方案2】:

我设法通过以下方式解决了这个问题:

修复并重新安装 Python 3 修复并重新安装 Python 启动器 创建 HKCU\Software\Classes\Python.File\shellex\DropHandler,默认=BEA218D2-6950-497B-9434-61683EC065FE 修改HKLM\Software\Classes\Python.File\shell\open\command,设置default="C:\Users\my_user_name\AppData\Local\Programs\Python\Python37-32\python.exe" "% 1" %*

【讨论】:

不使用 Python.File 中的 py.exe 启动器,您将失去在脚本中支持 shebangs 的能力,该脚本支持多个 Python 安装,特别是支持在特定虚拟环境中运行脚本.

以上是关于Python 3.x 拖放在 Windows 中损坏的主要内容,如果未能解决你的问题,请参考以下文章

文件拖放在列表框上不起作用

我想从 Silverlight UIElement 中拖动图像并将其放在用户桌面或 Windows 资源管理器上

拖放在 C# Winforms 应用程序中不起作用

windows xp怎样将经常使用的程序像windows7那样放在快速启动栏下呢?

列表视图拖放在目标上没有可视高亮显示

在 python 中,如何将 1 个或多个文件作为具有绝对路径的参数拖放到我的脚本中? (适用于 windows、linux 和 mac)