单个cmd.exe会话的临时文件关联
我想为.py文件设置一个关联,让它们在特定的Python版本下运行。不过,我只想在一个cmd.exe的会话中这样设置(其他并行的会话不受影响)。请问Windows可以做到这一点吗?
我怀疑答案是否定的,但我想先看看一些证据,再决定是否把这个想法提出来,看看能不能把这个功能加到virtualenv里。
4 个回答
你最好的办法可能是在脚本里设置一下PATH变量,然后通过写 python script.py
来调用Python。文件关联是全局的,多个程序之间是共享的。而环境变量是只在一个程序内部有效的,所以我建议你用这个方法。
在Windows系统中,你可以通过命令行来更改文件关联,使用的命令是 assoc
和 ftype
(你可以从这里下载一个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
会话之前恢复之前的设置。
当然可以。你在对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时会使用哪些环境变量?