单个cmd.exe会话的临时文件关联

10 投票
4 回答
4116 浏览
提问于 2025-04-16 15:17

我想为.py文件设置一个关联,让它们在特定的Python版本下运行。不过,我只想在一个cmd.exe的会话中这样设置(其他并行的会话不受影响)。请问Windows可以做到这一点吗?

我怀疑答案是否定的,但我想先看看一些证据,再决定是否把这个想法提出来,看看能不能把这个功能加到virtualenv里。

4 个回答

1

你最好的办法可能是在脚本里设置一下PATH变量,然后通过写 python script.py 来调用Python。文件关联是全局的,多个程序之间是共享的。而环境变量是只在一个程序内部有效的,所以我建议你用这个方法。

3

在Windows系统中,你可以通过命令行来更改文件关联,使用的命令是 assocftype(你可以从这里下载一个Windows命令参考的PDF文件)。

你可以用 assoc 命令查看当前与 .py 文件关联的文件类型:

> assoc .py
.py=Python.File

有了这些信息后,你可以使用 ftype 命令来检查当前与 Python.File 文件类型关联的程序:

> ftype Python.File
Python.File="C:\Python2.6\python.exe" "%1" %*

你还可以使用 ftype更改 关联的程序:

> ftype Python.File="C:\Python2.7\python.exe" "%1" %*
Python.File="C:\Python2.7\python.exe" "%1" %*

通过这种方式设置的关联是持久的,因为它们会存储在Windows注册表中。这意味着在你结束 cmd.exe 会话之前,你需要设置或恢复你想要的关联。我建议你使用一个或多个批处理文件来实现这个目的。

cmd.exe 本身接受一个 /k 参数,你可以用它在启动时执行一个批处理文件,来设置你想要的文件关联。然后,你还可以提供一个自定义的 quit.bat 文件,在退出 cmd 会话之前恢复之前的设置。

9

当然可以。你在对Jakob的回答评论中已经很接近答案了 -

如果可以通过环境变量来改变文件关联,那就太好了,但这似乎不太可能。

其实是可以的。你只需要使用 REG_EXPAND_SZ 类型的注册表键,并在这个键的值中使用环境变量。例如,把
%python_home%\python %1 %*
放在
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
这个键的 (Default) 值里,并把它的值设置为 REG_EXPAND_SZ,这样就可以定义你的Python文件用哪个Python来打开。你可以通过设置 python_home 环境变量来决定,当然你也可以在每次命令行会话中进行设置。可以看看我对这个问题的回答,了解 Windows在注册表中存储哪些程序来打开特定文件类型?

说到这里,现在有一个专门解决这个问题的工具,我强烈推荐。它叫做 pylauncher。根据文档:

这是一个兼容PEP 397的Windows下Python启动器。详情请见 http://www.python.org/dev/peps/pep-0397/,还有 http://www.red-dove.com/screencasts/launcher/launcher.html 的演示视频。

如果你把它添加到 PATHEXT 环境变量中,甚至可以省略 .py 后缀。可以参考这个问题 从命令行调用EXE时会使用哪些环境变量?

撰写回答