npm 使用两个版本的 Python

6 投票
2 回答
3946 浏览
提问于 2025-04-18 13:17

每次我安装某些 node 包时,都会遇到和 Python 版本相关的错误。这是因为我同时安装了 Python 2.7Python 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 个回答

-1

我在不同版本的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版本,而不是先检查文件。

2

使用 virtualenvnodeenv,你可以随意组合不同版本的软件。

撰写回答