MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

J. *_*son 69 python macos npm node-gyp

我已经花了整整一周的时间寻找这个问题的答案,但没有成功。我查看了所有 StackOverflow 帖子、Google 的每一篇文章以及我能找到的每个相关的 Github 问题。大多数相关错误似乎都比较旧,所以我想知道我的问题是否由于我使用的是 macOS Big Sur 而略有不同。

\n

问题: \n当我尝试yarn install在本地存储库中运行时,收到与 node-gyp 相关的错误以及无法找到的 python 可执行文件。这是我的终端显示的内容:

\n
yarn install v1.22.17\n\n...other stuff\n\n[4/4]   Building fresh packages...\n[6/13] \xe2\xa0\x90 node-sass\n[2/13] \xe2\xa0\x90 node-sass\n[10/13] \xe2\xa0\x90 metrohash\n[4/13] \xe2\xa0\x90 fsevents\nerror /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/metrohash: Command failed.\nExit code: 1\nCommand: node-gyp rebuild\nArguments:\nDirectory: /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/metrohash\nOutput:\ngyp info it worked if it ends with ok\ngyp info using node-gyp@3.8.0\ngyp info using node@12.18.0 | darwin | x64\ngyp ERR! configure error\ngyp ERR! stack Error: Can\'t find Python executable "/usr/local/opt/python@3.9/bin/python3", you can set the PYTHON env variable.\ngyp ERR! stack     at PythonFinder.failNoPython (/Users/jimmiejackson/Documents/repositories/repo-name/node_modules/node-gyp/lib/configure.js:484:19)\ngyp ERR! stack     at PythonFinder.<anonymous> (/Users/jimmiejackson/Documents/repositories/repo-name/node_modules/node-gyp/lib/configure.js:406:16)\ngyp ERR! stack     at F (/Users/jimmiejackson/Documents/repositories/repo-name/node_modules/which/which.js:68:16)\ngyp ERR! stack     at E (/Users/jimmiejackson/Documents/repositories/repo-name/node_modules/which/which.js:80:29)\ngyp ERR! stack     at /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/which/which.js:89:16\ngyp ERR! stack     at /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/isexe/index.js:42:5\ngyp ERR! stack     at /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/isexe/mode.js:8:5\ngyp ERR! stack     at FSReqCallback.oncomplete (fs.js:167:21)\ngyp ERR! System Darwin 20.6.0\ngyp ERR! command "/Users/jimmiejackson/.nvm/versions/node/v12.18.0/bin/node" "/Users/jimmiejackson/Documents/repositories/repo-name/node_modules/metrohash/node_modules/.bin/node-gyp" "rebuild"\ngyp ERR! cwd /Users/jimmiejackson/Documents/repositories/repo-name/node_modules/metrohash\n
Run Code Online (Sandbox Code Playgroud)\n

我不完全确定这个错误意味着什么或者为什么这个节点模块正在搜索 python3。我尝试运行npm set config /path/to/python、下载 python3、在 .zshrc 配置文件中设置 PYTHON 路径,但似乎没有任何效果。我对这个问题缺乏理解,这完全有可能意味着我走在正确的道路上,但没有完全得到正确的东西。有任何想法吗?

\n

Pau*_*est 143

这个问题也困扰了我一周,因为node-gyp实际上可以很好地找到我的 Python 实例,但后来的构建步骤配置不正确,所有流行的答案都无法选择 Python。我在 macOS Monterey 上解决问题的步骤 ( 12.3.1)...

$ brew install pyenv

# Any modern version python should do. I don't think Python 2 is required any more.
$ pyenv install 3.10.3
$ pyenv global 3.10.3

# Add pyenv to your PATH so that you can reference python (not python3)
$ echo "export PATH=\"\${HOME}/.pyenv/shims:\${PATH}\"" >> ~/.zshrc
$ source ~/.zshrc

# open a new terminal window and confirm your pyenv version is mapped to python
$ which python
$ python --version

# Now try to re-run yarn install
$ yarn
Run Code Online (Sandbox Code Playgroud)

  • @DeepakThota 尝试使用上面的答案,但将“3.10.3”替换为“2.7.18”。如果需要“python2”...尝试将“python2”也指向新安装的Python版本。`导出 python2=python` (10认同)
  • 是的,使用“pyenv install 2.7.18”并导出它是有效的。谢谢你! (4认同)
  • 如果您愿意,可以添加 python2 以在本地为特定文件夹设置。进入该文件夹并运行“pyenv local 2.7.18” (4认同)
  • 执行`源~/. 编辑后的 ​​zshrc` (4认同)

wil*_*ode 33

阅读gyp-node 源代码可能会有所帮助。您可以尝试以下一些步骤。

  1. 安装python2。您应该确保在终端中,which -a python2仅返回一个python2python2 -V返回正确的 2.x 版本。

  2. 覆盖PYTHON环境。export PYTHON=python2

  3. 重新运行安装。

如果仍然存在错误,则错误消息可能有所不同。

  • 是的,在阅读代码时我有点惊讶,无论如何,“PYTHON”环境都会附加“PATH”,所以把 python 的完整路径放在那里是错误的。这有点奇怪,很容易解释你的问题,但肯定这可能只是因为你的项目中的依赖项之一使用旧的“node-gyp”。 (3认同)

Jan*_*imo 30

如果您像我一样从节点 14 升级到节点 16,则可能会遇到此问题。在这种情况下,一个简单的解决方法可能是确保纱线解析node-sass为版本 6。

将其设置在您的package.json

 "resolutions": {
    "node-sass": "^6.0.1"
  }
Run Code Online (Sandbox Code Playgroud)


Ped*_*iro 7

我相信您可以通过添加前缀来显式定义环境变量npm_config

$ export npm_config_python=/path/to/python
Run Code Online (Sandbox Code Playgroud)

通过列出配置来检查是否已配置:

$ npm config list
...

; environment configs
python = "/path/to/python"
Run Code Online (Sandbox Code Playgroud)

这应该被 拾取node-gyp

另一种方法是将其定义为.npmrc

python = "/path/to/python"
Run Code Online (Sandbox Code Playgroud)

第三种方法是全局设置:

npm config --global set python /path/to/python
Run Code Online (Sandbox Code Playgroud)