在Windows资源管理器中将文件拖放到Python脚本上

60
我想将我的数据文件拖放到一个Python脚本上,让它处理该文件并生成输出。Python脚本接受数据文件名作为命令行参数,但Windows资源管理器不允许脚本成为拖放目标。是否需要在某个地方进行某种配置才能使其工作?

我认为,如果您从Windows安装程序中安装了Python(基本上可以双击运行Python脚本),那么它只能正常运行。 - Joran Beasley
在Windows 10上,我需要双击PY文件并使用Python打开一次,才能识别下拉处理程序。 - XP1
8个回答

61
当然。从一个名为“在Windows中使Python脚本可拖放”的无意义技术文章,您可以通过添加注册表键来添加拖放处理程序:

Here’s a registry import file that you can use to do this. Copy the following into a .reg file and run it (Make sure that your .py extensions are mapped to Python.File).

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"
This makes Python scripts use the WSH drop handler, which is compatible with long filenames. To use the short filename handler, replace the GUID with 86C86720-42A0-1069-A2E8-08002B30309D.

该操作使Python脚本使用WSH拖放处理程序,该处理程序与长文件名兼容。要使用短文件名处理程序,请将GUID替换为86C86720-42A0-1069-A2E8-08002B30309D

该帖子中的评论指出,可以通过使用Python.NoConFilePython.CompiledFile类来启用“无控制台Python文件(.pyw)”或“已编译的Python文件(.pyc)”上的拖放功能。


你把文件放在哪里?放在控制台窗口里吗?还是放在脚本文件图标上?我不太明白。 - Greg
感谢@Blair提供的解决方案。我是一个初学者,在删除后出现了错误“没有这样的文件或目录”。您可以通过在脚本开头添加以下内容来解决此问题:exepath = sys.argv[0] if '\\' in exepath: os.chdir(exepath[:exepath.rfind('\\')]) - Bludwarf
4
这份信息已经过时了。在 Python 2.6.1(2008 年 12 月)中,WSH 拖放处理程序被添加到了安装程序中。但由于 WSH 处理程序不支持 Unicode 路径,因此为 3.6.0(2016 年 12 月)和 3.5.3(2017 年 1 月)创建了一个新的拖放处理程序。只要 .py 文件与“Python.File”progid相关联,这个问题应该对 Windows 上当前支持的所有 CPython 版本都有效。但最好安装 3.5.3+ 版本以获得新的拖放处理程序。 - Eryk Sun
@Norfeldt 我在 https://github.com/endolith/waveform_analysis/blob/master/scripts/wave_analyzer_launcher.py 上有一个笨重的错误打印工具。 - endolith
1
@eryksun,您能否将此信息添加到halanson的答案中? - Stevoisiak
2
有人能解释一下“确保您的.py扩展名映射到Python.File”是什么意思吗?我已经将.py文件默认设置为使用python.exe打开,但这个reg脚本不允许我在它们上面拖放。 - pyjamas

46

编写一个简单的shell脚本 (file.bat)

"C:\python27\python.exe" yourprogram.py %*

%*代表你传递给脚本的所有参数。

现在将目标文件拖放到file.bat图标上。


你如何在Python中访问参数列表? - jjz
1
你可以通过 for arg in sys.argv[1:]: print(arg) 访问每个参数。 - jjz
似乎文件是随机排序的。是否有办法保留选定的顺序? - Gillespie
@Gillespie Windows 没有正确地保留项目选择的顺序:例如,当我将 .mp3 文件拖放到 VLC 中时,我最后选择的项目将成为播放列表中的第一个。 - Hobbes
@Gillespie 我认为倒序会解决这个问题。 - Abdessabour Mtk

18

如果安装了 Python(至少 2.6.1 版本),您可以将任何文件拖放到 Python 脚本上来运行。

import sys
droppedFile = sys.argv[1]
print droppedFile

sys.argv[0]代表脚本本身。sys.argv[n+1]代表你拖入的文件。


这个答案是最简单和最容易的。而且,在将其转换为exe之后,已经测试可以与py2exe(使用Python 3.3)一起使用。 - Splic
这个方案可行,但和其他解决方案一样,似乎文件是以随机顺序排列的。有没有办法保留它们被选择的顺序? - Gillespie
@Gillespie 不是很对。尝试点击并拖动选择中的第一个文件,而不是选择中间的某个文件。根据您的用例,您还可以使用内部排序算法。 - halanson

6

尝试使用py2exe。使用py2exe将您的Python脚本转换为Windows可执行文件。然后,您应该能够在Windows资源管理器中拖放输入文件到您的脚本中。您还应该能够在桌面上创建一个快捷方式,并将输入文件拖放到它上面。如果您的Python脚本可以接受文件列表,您应该能够将多个文件拖放到您的脚本(或快捷方式)上。


3

1). 创建 .py 的快捷方式
2). 右键单击 -> 属性
3). 在 "目标:"之前添加 "python",以便将 .py 作为参数运行到 python 命令中
或者
1). 创建一个 .bat
2). 运行 "python some.py %*"

这些快捷方式对我来说最简单了,可以满足我所需要的功能。否则我会将其转换为 .exe,但我更愿意使用 Java 或 C / C++。


3

创建文件的快捷方式。如果你没有将Python默认打开.py文件,可以进入快捷方式的属性并编辑快捷方式的目标以包括你正在使用的Python版本。例如:

目标:C:\Python26\python.exe < 快捷方式目标路径>

我发布这个帖子是因为我不想编辑注册表,而且.bat解决方法对我也不起作用。


虽然我没有完全按照这个方法操作,但是这个答案揭示了我的问题所在:我的 Python 脚本的目标默认设置为“使用 VS Code 打开”,而不是 Python。将其更改为 Python 后,问题得到解决。 - simon

2
晚来的回答,但是这个页面上的任何答案都不能解决我的问题。
我成功启用/修复了拖放到.py脚本上的方法:
  1. HKEY_CLASSES_ROOT\.py -> 将默认值设为 Python.File

  2. HKEY_CLASSES_ROOT\Python.File\Shell\Open -> 创建一个名为Command的键,并将默认值设置为"C:\Windows\py.exe" "%1" %*

  3. CLASSES_ROOT\Applications\py.exe\open\command -> 如果不存在,则创建键并将默认值设置为"C:\Windows\py.exe" "%1" %*

  4. CLASSES_ROOT\Python.File\ShellEx -> 创建键 DropHandler 并将默认值设置为{86C86720-42A0-1069-A2E8-08002B30309D}

就是这样。通过将文件拖动到Python脚本上进行测试:

import sys

args = sys.argv
print(args)

这对我有用,但要记得终止 explorer.exe 并重新启动它。此外,不确定是否正常,但最终会以截断的文件名结束,例如 829897~1.JSO,而不是真实的“82989762511648_11612593811973.json”,但尝试打开路径按预期工作。 - Ehsan Kia
1
找到了解决自己问题的方法,不要像第4步建议的那样使用{86C...,而应该使用{60254CA5-953B-11CF-8C96-00AA00B8708C}来获取更好的DropHandler,它支持长文件名。 - Ehsan Kia

0
对于那些在 .py 脚本中使用 argv 但仍然无法拖动文件执行的人, 这可以通过简单地使用带有火箭图标的 Python Launcher 来解决。
脚本属性 "打开文件" 被设置为 python.exe, 它不知道脚本需要命令行参数 "%*"。
参考:https://bugs.python.org/issue40253

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接