Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

python3.12でnpm iをすると、エラーになる話

問題

npm iを叩くと以下のようなエラーに遭遇

npm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs
npm WARN deprecated stringify-package@1.0.1: This module is not used anymore, and has been replaced by @npmcli/package-json
npm ERR! code 1
npm ERR! path E:\test\electron-acrylic-window\node_modules\@seorii\win32-displayconfig
npm ERR! command failed
npm ERR! command C:\Windows\system32\cmd.exe /d /s /c npm run rebuild
npm ERR! > @seorii/win32-displayconfig@0.1.1 rebuild
npm ERR! > node-gyp rebuild
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@8.4.1
npm ERR! gyp info using node@20.10.0 | win32 | x64
npm ERR! gyp info find Python using Python version 3.12.0 found at "C:\Users\Aptyp\AppData\Local\Programs\Python\Python312\python.exe"
npm ERR! gyp info find VS using VS2022 (17.6.33829.357) found at:
npm ERR! gyp info find VS "C:\Program Files\Microsoft Visual Studio\2022\Community"
npm ERR! gyp info find VS run with --verbose for detailed information
npm ERR! gyp info spawn C:\Users\Aptyp\AppData\Local\Programs\Python\Python312\python.exe
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args   'E:\\test\\electron-acrylic-window\\node_modules\\node-gyp\\gyp\\gyp_main.py',
npm ERR! gyp info spawn args   'binding.gyp',
npm ERR! gyp info spawn args   '-f',
npm ERR! gyp info spawn args   'msvs',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'E:\\test\\electron-acrylic-window\\node_modules\\@seorii\\win32-displayconfig\\build\\config.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'E:\\test\\electron-acrylic-window\\node_modules\\node-gyp\\addon.gypi',
npm ERR! gyp info spawn args   '-I',
npm ERR! gyp info spawn args   'C:\\Users\\Aptyp\\AppData\\Local\\node-gyp\\Cache\\20.10.0\\include\\node\\common.gypi',
npm ERR! gyp info spawn args   '-Dlibrary=shared_library',
npm ERR! gyp info spawn args   '-Dvisibility=default',
npm ERR! gyp info spawn args   '-Dnode_root_dir=C:\\Users\\Aptyp\\AppData\\Local\\node-gyp\\Cache\\20.10.0',
npm ERR! gyp info spawn args   '-Dnode_gyp_dir=E:\\test\\electron-acrylic-window\\node_modules\\node-gyp',
npm ERR! gyp info spawn args   '-Dnode_lib_file=C:\\\\Users\\\\Aptyp\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\20.10.0\\\\<(target_arch)\\\\node.lib',
npm ERR! gyp info spawn args   '-Dmodule_root_dir=E:\\test\\electron-acrylic-window\\node_modules\\@seorii\\win32-displayconfig',
npm ERR! gyp info spawn args   '-Dnode_engine=v8',
npm ERR! gyp info spawn args   '--depth=.',
npm ERR! gyp info spawn args   '--no-parallel',
npm ERR! gyp info spawn args   '--generator-output',
npm ERR! gyp info spawn args   'E:\\test\\electron-acrylic-window\\node_modules\\@seorii\\win32-displayconfig\\build',
npm ERR! gyp info spawn args   '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! Traceback (most recent call last):
npm ERR!   File "E:\test\electron-acrylic-window\node_modules\node-gyp\gyp\gyp_main.py", line 42, in <module>
npm ERR!     import gyp  # noqa: E402
npm ERR!     ^^^^^^^^^^
npm ERR!   File "E:\test\electron-acrylic-window\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 9, in <module>
npm ERR!     import gyp.input
npm ERR!   File "E:\test\electron-acrylic-window\node_modules\node-gyp\gyp\pylib\gyp\input.py", line 19, in <module>
npm ERR!     from distutils.version import StrictVersion
npm ERR! ModuleNotFoundError: No module named 'distutils'
npm ERR! gyp ERR! configure error
npm ERR! gyp ERR! stack Error: `gyp` failed with exit code: 1
npm ERR! gyp ERR! stack     at ChildProcess.onCpExit (E:\test\electron-acrylic-window\node_modules\node-gyp\lib\configure.js:259:16)
npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:514:28)
npm ERR! gyp ERR! stack     at ChildProcess._handle.onexit (node:internal/child_process:294:12)
npm ERR! gyp ERR! System Windows_NT 10.0.22000
npm ERR! gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "E:\\test\\electron-acrylic-window\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
npm ERR! gyp ERR! cwd E:\test\electron-acrylic-window\node_modules\@seorii\win32-displayconfig
npm ERR! gyp ERR! node -v v20.10.0
npm ERR! gyp ERR! node-gyp -v v8.4.1
npm ERR! gyp ERR! not ok

どうやら、

ModuleNotFoundError: No module named 'distutils'

が問題っぽい。

生じた環境は、

  • python 3.12
  • npm 10系
  • node 21系

です。

原因

根本的な問題は、 distutilsがpython3.12系では削除されたためだそうです。

github.com

解決策

解決策1

pip install setuptool

でだそうです。

筆者は、これでは解決しなかったです。

解決策2

virtualenvを使う方法もあるようです。

pip install virtualenv
virtualenv -p python3.10 venv

source venv/bin/activate

stackoverflow.com

解決策3

pythonのダウングレードが最も早いです。マストな要件がないのであれば、ダウングレードしてしまいましょう。

筆者はこれで解決しました。

なお、nodeが21系だと、node-saasで失敗するので、nodeも16系にダウングレードしました。

qiita.com