npm 使用两个版本的 Python
每次我安装某些 node
包时,都会遇到和 Python
版本相关的错误。这是因为我同时安装了 Python 2.7
和 Python 3.3
(这些是我上次更新时的最新版本,但现在已经有 3.4
了),显然我在 PATH
中只能使用一个版本(后面的文件夹会被覆盖)。我在 PATH
中设置了 Python 3.3
,因为它是更新的版本,但即便如此,仍然有很多程序,包括 npm
模块,依然使用 Python 2
,这已经过去了超过5年。
有没有办法为那些还不能使用版本3的模块提供一个“备用”的 Python
版本呢?如果能有一个通用的解决方案那就太好了,但至少我希望能有一个在安装 npm
模块时的解决办法。请注意,有些模块可能完全可以使用 Python 3
,不过我不确定是否有模块不能使用 Python 2
。所以,最好的解决方案是能同时支持这两种版本,兼容时使用最新版本,不兼容时使用旧版本。
供参考,我的 Python 2.7
安装在 C:\Python27\python
文件夹中,而 Python 3.3
则在 C:\Python33\python
文件夹中。我遇到的 npm
错误是:
contextify@0.1.8 install c:\repos\konneka\node_modules\buster\node_modules\bus ter-syntax\node_modules\jsdom\node_modules\contextify node-gyp rebuild
|
c:\repos\konneka\node_modules\buster\node_modules\buster-syntax\node_modules\jsd
om\node_modules\contextify>node "c:\Program Files\nodejs\node_modules\npm\bin\no
de-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild
when@1.3.0 node_modules\buster\node_modules\buster-server-cli\node_modules\buste
r-cli\node_modules\buster-configuration\node_modules\when
lodash@0.5.2 node_modules\buster\node_modules\buster-test-cli\node_modules\ramp\
node_modules\ramp-resources\node_modules\lodash
gyp ERR! configure error
gyp ERR! stack Error: Python executable "python" is v3.3.2, which is not support
ed by gyp.
gyp ERR! stack You can pass the --python switch to point to Python >= v2.5.0 & <
3.0.0.
gyp ERR! stack at failPythonVersion (c:\Program Files\nodejs\node_modules\np
m\node_modules\node-gyp\lib\configure.js:108:14)
gyp ERR! stack at c:\Program Files\nodejs\node_modules\npm\node_modules\node
-gyp\lib\configure.js:97:9
gyp ERR! stack at ChildProcess.exithandler (child_process.js:645:7)
gyp ERR! stack at ChildProcess.emit (events.js:98:17)
gyp ERR! stack at maybeClose (child_process.js:755:16)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:822:
5)
ERR! System Windows_NT 6.2.9200
command "node" "c:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\nod
e-gyp\\bin\\node-gyp.js" "rebuild"
esprima-fb@3001.1.0-dev-harmony-fb node_modules\browserify\node_modules\syntax-e
rror\node_modules\esprima-fb
http-proxy@0.10.4 node_modules\karma\node_modules\http-proxy
├── pkginfo@0.3.0
└── utile@0.2.1 (deep-equal@0.2.1, async@0.2.10, ncp@0.4.2, i@0.3.2, mkdirp@0.5.
0)
cwd c:\repos\konneka\node_modules\buster\node_modules\buster-syntax\node_module
s\jsdom\node_modules\contextify
gyp ERR! node -v v0.10.29
gyp ERR! node-gyp -v v0.13.1
gyp ERR! not ok
2 个回答
我在不同版本的Python之间切换的方法是,在Python文件的开头加上一个特殊的标记,叫做shebang。
具体来说,就是在文件的开头加上:
#!python2
当你双击这个文件时,py.exe(或者pyw.exe)会根据这个标记找到对应的Python版本来运行它(前提是它能找到这个版本)。你甚至可以指定:
#!python2.7
这样可以明确使用2.7版本,假设你安装了多个Python 2的版本。
在安装模块时,如果想利用这个功能,只需把这个标记加到安装文件的第一行,然后在命令行中就不用再写Python了。
假设你像我一样使用批处理文件来安装模块,大多数人会写:
python setup.py install
然后我会用:
setup.py install
这样可以确保安装脚本使用的是指定的Python版本。
我还发现,经过一段时间在Python 2和3之间切换后,编辑注册表会让我更方便地通过右键点击Python文件来选择用IDLE 2或3打开。
补充说明:我应该提到,这个方法只有在最后安装的是Python 3时才有效,因为Python 2会在注册表中设置一些不太友好的值,直接指向Python 2版本,而不是先检查文件。
使用 virtualenv 和 nodeenv,你可以随意组合不同版本的软件。