Node.js fs.R_OK 弃用的解决方法(DeprecationWarning 修复教程)

Node.js fs.R_OK 弃用的解决方法(DeprecationWarning 修复教程)

关键词:Node.js 报错、fs.R_OK 弃用、DeprecationWarning 解决方法、fs.constants.R_OK、Node.js 文件权限、前端踩坑记录


🧑‍💻前言:一次奇怪的 Node.js 报错经历

前几天写一个小工具,用 Node.js 处理文件权限检查。正常跑着跑着,终端突然冒出一行黄黄的警告,看着挺扎眼:

DeprecationWarning: fs.R_OK is deprecated, use fs.constants.R_OK instead

说实话,一开始我还愣了一下:
R_OK 被弃用了?什么时候的事?

作为在国内做前端这么多年的人,Node.js 这类 “silent update” 真是让我时不时踩坑。于是我顺手查了下具体原因,也顺便把这次经验整理成文章,希望你看到这篇文章时能少踩一点坑。


📌问题是怎么出现的?

警告内容其实非常直白:

fs.R_OK 已经被官方标记为弃用(deprecated),推荐改用 fs.constants.R_OK

npm error code 1 npm error path E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass npm error command failed npm error command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js npm error Building: D:\nodejs\node.exe E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\bin\node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library= npm error gyp info it worked if it ends with ok npm error gyp verb cli [ npm error gyp verb cli 'D:\\nodejs\\node.exe', npm error gyp verb cli 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\bin\\node-gyp.js', npm error gyp verb cli 'rebuild', npm error gyp verb cli '--verbose', npm error gyp verb cli '--libsass_ext=', npm error gyp verb cli '--libsass_cflags=', npm error gyp verb cli '--libsass_ldflags=', npm error gyp verb cli '--libsass_library=' npm error gyp verb cli ] npm error gyp info using node-gyp@3.8.0 npm error gyp info using node@22.13.0 | win32 | x64 npm error gyp verb command rebuild [] npm error gyp verb command clean [] npm error gyp verb clean removing "build" directory npm error gyp verb command configure [] npm error gyp verb check python checking for Python executable "python2" in the PATH npm error gyp verb `which` failed Error: not found: python2 npm error gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:13:12) npm error gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:68:19) npm error gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:80:29) npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:89:16 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\index.js:42:5 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\windows.js:36:5 npm error gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:198:21) npm error gyp verb `which` failed python2 Error: not found: python2 npm error gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:13:12) npm error gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:68:19) npm error gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:80:29) npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:89:16 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\index.js:42:5 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\windows.js:36:5 npm error gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:198:21) { npm error gyp verb `which` failed code: 'ENOENT' npm error gyp verb `which` failed } npm error gyp verb check python checking for Python executable "python" in the PATH npm error gyp verb `which` failed Error: not found: python npm error gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:13:12) npm error gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:68:19) npm error gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:80:29) npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:89:16 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\index.js:42:5 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\windows.js:36:5 npm error gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:198:21) npm error gyp verb `which` failed python Error: not found: python npm error gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:13:12) npm error gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:68:19) npm error gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:80:29) npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\which\which.js:89:16 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\index.js:42:5 npm error gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\node_modules\isexe\windows.js:36:5 npm error gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:198:21) { npm error gyp verb `which` failed code: 'ENOENT' npm error gyp verb `which` failed } npm error gyp verb could not find "python". checking python launcher npm error (node:3916) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead. npm error (Use `node --trace-deprecation ...` to show where the warning was created) npm error gyp verb check python launcher python executable found: "D:\\Python27\\python.exe" npm error gyp verb check python version `D:\Python27\python.exe -c "import sys; print "2.7.18 npm error gyp verb check python version .%s.%s" % sys.version_info[:3];"` returned: %j npm error gyp verb get node dir no --target version specified, falling back to host node version: 22.13.0 npm error gyp verb command install [ '22.13.0' ] npm error gyp verb install input version string "22.13.0" npm error gyp verb install installing version: 22.13.0 npm error gyp verb install --ensure was passed, so won't reinstall if already installed npm error (node:3916) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. npm error gyp verb install version is already installed, need to check "installVersion" npm error gyp verb got "installVersion" 9 npm error gyp verb needs "installVersion" 9 npm error gyp verb install version is good npm error gyp verb get node dir target node version installed: 22.13.0 npm error gyp verb build dir attempting to create "build" dir: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build npm error gyp verb build dir "build" dir needed to be created? E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build npm error gyp verb Not using VS2017: Could not use PowerShell to find VS2017 npm error gyp verb build/config.gypi creating config file npm error gyp verb build/config.gypi writing out config file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build\config.gypi npm error gyp verb config.gypi checking for gypi file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\config.gypi npm error gyp verb common.gypi checking for gypi file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\common.gypi npm error gyp verb gyp gyp format was not specified; forcing "msvs" npm error gyp info spawn D:\Python27\python.exe npm error gyp info spawn args [ npm error gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\gyp\\gyp_main.py', npm error gyp info spawn args 'binding.gyp', npm error gyp info spawn args '-f', npm error gyp info spawn args 'msvs', npm error gyp info spawn args '-G', npm error gyp info spawn args 'msvs_version=auto', npm error gyp info spawn args '-I', npm error gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass\\build\\config.gypi', npm error gyp info spawn args '-I', npm error gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\addon.gypi', npm error gyp info spawn args '-I', npm error gyp info spawn args 'C:\\Users\\huxio\\.node-gyp\\22.13.0\\include\\node\\common.gypi', npm error gyp info spawn args '-Dlibrary=shared_library', npm error gyp info spawn args '-Dvisibility=default', npm error gyp info spawn args '-Dnode_root_dir=C:\\Users\\huxio\\.node-gyp\\22.13.0', npm error gyp info spawn args '-Dnode_gyp_dir=E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp', npm error gyp info spawn args '-Dnode_lib_file=C:\\Users\\huxio\\.node-gyp\\22.13.0\\<(target_arch)\\node.lib', npm error gyp info spawn args '-Dmodule_root_dir=E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass', npm error gyp info spawn args '-Dnode_engine=v8', npm error gyp info spawn args '--depth=.', npm error gyp info spawn args '--no-parallel', npm error gyp info spawn args '--generator-output', npm error gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass\\build', npm error gyp info spawn args '-Goutput_dir=.' npm error gyp info spawn args ] npm error gyp: Undefined variable standalone_static_library in binding.gyp while trying to load binding.gyp npm error gyp ERR! configure error npm error gyp ERR! stack Error: `gyp` failed with exit code: 1 npm error gyp ERR! stack at ChildProcess.onCpExit (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\lib\configure.js:345:16) npm error gyp ERR! stack at ChildProcess.emit (node:events:524:28) npm error gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:293:12) npm error gyp ERR! System Windows_NT 10.0.26100 npm error gyp ERR! command "D:\\nodejs\\node.exe" "E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library=" npm error gyp ERR! cwd E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass npm error gyp ERR! node -v v22.13.0 npm error gyp ERR! node-gyp -v v3.8.0 npm error gyp ERR! not ok npm error Build failed with error code: 1 npm error A complete log of this run can be found in: C:\Users\huxio\AppData\Local\npm-cache\_logs\2025-10-11T03_09_50_737Z-debug-0.log
10-12
npm ERR! code 1 npm ERR! path E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js npm ERR! Building: D:\nodejs\node.exe E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\bin\node-gyp.js rebuild --verbose --libsass_ext= --libs npm ERR! gyp info it worked if it ends with ok npm ERR! gyp verb cli [ npm ERR! gyp verb cli 'D:\\nodejs\\node.exe', npm ERR! gyp verb cli 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\bin\\node-gyp.js', npm ERR! gyp verb cli 'rebuild', npm ERR! gyp verb cli '--verbose', npm ERR! gyp verb cli '--libsass_ext=', npm ERR! gyp verb cli '--libsass_cflags=', npm ERR! gyp verb cli '--libsass_ldflags=', npm ERR! gyp verb cli '--libsass_library=' npm ERR! gyp verb cli ] npm ERR! gyp info using node-gyp@3.8.0 npm ERR! gyp info using node@16.20.2 | win32 | x64 npm ERR! gyp verb command rebuild [] npm ERR! gyp verb command clean [] npm ERR! gyp verb clean removing "build" directory npm ERR! gyp verb command configure [] npm ERR! gyp verb check python checking for Python executable "‪D:\Python27\python.exe" in the PATH npm ERR! gyp verb `which` failed Error: not found: ‪D:\Python27\python.exe npm ERR! gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:13:12) npm ERR! gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:68:19) npm ERR! gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:80:29) npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:89:16 npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\isexe\index.js:42:5 npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\isexe\windows.js:36:5 npm ERR! gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:202:21) npm ERR! gyp verb `which` failed ‪D:\Python27\python.exe Error: not found: ‪D:\Python27\python.exe npm ERR! gyp verb `which` failed at getNotFoundError (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:13:12) npm ERR! gyp verb `which` failed at F (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:68:19) npm ERR! gyp verb `which` failed at E (E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:80:29) npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\which\which.js:89:16 npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\isexe\index.js:42:5 npm ERR! gyp verb `which` failed at E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\isexe\windows.js:36:5 npm ERR! gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:202:21) { npm ERR! gyp verb `which` failed code: 'ENOENT' npm ERR! gyp verb `which` failed } npm ERR! gyp verb could not find "‪D:\Python27\python.exe". checking python launcher npm ERR! gyp verb check python launcher python executable found: "D:\\Python27\\python.exe" npm ERR! gyp verb check python version `D:\Python27\python.exe -c "import sys; print "2.7.18 npm ERR! gyp verb check python version .%s.%s" % sys.version_info[:3];"` returned: %j npm ERR! gyp verb get node dir no --target version specified, falling back to host node version: 16.20.2 npm ERR! gyp verb command install [ '16.20.2' ] npm ERR! gyp verb install input version string "16.20.2" npm ERR! gyp verb install installing version: 16.20.2 npm ERR! gyp verb install --ensure was passed, so won't reinstall if already installed npm ERR! gyp verb install version is already installed, need to check "installVersion" npm ERR! gyp verb got "installVersion" 9 npm ERR! gyp verb needs "installVersion" 9 npm ERR! gyp verb install version is good npm ERR! gyp verb get node dir target node version installed: 16.20.2 npm ERR! gyp verb build dir attempting to create "build" dir: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build npm ERR! gyp verb build dir "build" dir needed to be created? E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build npm ERR! gyp verb build/config.gypi creating config file npm ERR! gyp verb build/config.gypi writing out config file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\build\config.gypi npm ERR! (node:5732) [DEP0150] DeprecationWarning: Setting process.config is deprecated. In the future the property will be read-only. npm ERR! (Use `node --trace-deprecation ...` to show where the warning was created) npm ERR! gyp verb config.gypi checking for gypi file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\config.gypi npm ERR! gyp verb common.gypi checking for gypi file: E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass\common.gypi npm ERR! gyp verb gyp gyp format was not specified; forcing "msvs" npm ERR! gyp info spawn D:\Python27\python.exe npm ERR! gyp info spawn args [ npm ERR! gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\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 '-G', npm ERR! gyp info spawn args 'msvs_version=2022', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass\\build\\config.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args 'E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\addon.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args 'C:\\Users\\huxio\\.node-gyp\\16.20.2\\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\\huxio\\.node-gyp\\16.20.2', npm ERR! gyp info spawn args '-Dnode_gyp_dir=E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp', npm ERR! gyp info spawn args '-Dnode_lib_file=C:\\Users\\huxio\\.node-gyp\\16.20.2\\<(target_arch)\\node.lib', npm ERR! gyp info spawn args '-Dmodule_root_dir=E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass', 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:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-sass\\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:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\gyp_main.py", line 16, in <module> npm ERR! sys.exit(gyp.script_main()) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 545, in script_main npm ERR! return main(sys.argv[1:]) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 538, in main npm ERR! return gyp_main(args) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 514, in gyp_main npm ERR! options.duplicate_basename_check) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\__init__.py", line 98, in Load npm ERR! generator.CalculateVariables(default_variables, params) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\generator\msvs.py", line 1916, in CalculateVariables npm ERR! generator_flags.get('msvs_version', 'auto')) npm ERR! File "E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\gyp\pylib\gyp\MSVSVersion.py", line 434, in SelectVisualStudioVersion npm ERR! versions = _DetectVisualStudioVersions(version_map[version], 'e' in version) npm ERR! KeyError: '2022' 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:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-gyp\lib\configure.js:345:16) npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28) npm ERR! gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:293:12) npm ERR! gyp ERR! System Windows_NT 10.0.26100 npm ERR! gyp ERR! command "D:\\nodejs\\node.exe" "E:\\code\\bigDataRisk\\hnnd-risk-management-vue\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbos y=" npm ERR! gyp ERR! cwd E:\code\bigDataRisk\hnnd-risk-management-vue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.20.2 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\huxio\AppData\Local\npm-cache\_logs\2025-10-11T06_52_31_608Z-debug-0.log
10-12
<think> 我们面对的问题是使用PyInstaller打包包含PyTorch的程序时出现的三个主要问题: 1. ModuleNotFoundError: No module named 'tensorboard' 2. Windows或MacOS不支持重定向的警告 3. PyInstaller中关于torch相关模块用的警告 ### 问题分析 #### 第一个问题:缺少tensorboard模块 - 原因:PyTorch有时会依赖tensorboard(例如使用torch.utils.tensorboard),但PyInstaller在分析依赖时可能没有自动捕获到。 - 解决方案:显式添加`tensorboard``tensorboardX`(如果使用了)作为隐藏导入。 #### 第二个问题:重定向不支持 - 在Windows或MacOS上,可能由于PyInstaller的版本或系统权限问题,导致重定向失败(例如文件重定向、输出重定向)。 - 解决方案:更新PyInstaller到最新版本,并检查打包命令是否使用了可能导致重定向问题的参数(如`--noconsole`)。另外,可以尝试使用`.spec`文件进行高级配置。 #### 第三个问题:torch相关模块用警告 - 原因:PyInstaller的hook机制可能会引用一些torch中已经用的子模块。 - 解决方案:更新PyInstaller和torch到最新版本,确保兼容性。同时,我们可以通过修改hook文件或显式排除用的模块来解决。 ### 解决方案步骤 #### 步骤一:创建`.spec`文件 首先,生成一个`.spec`文件以便进行高级配置: ```bash pyi-makespec --onefile main.py ``` #### 步骤二:修改`.spec`文件 修改生成的`main.spec`文件,添加必要的配置: ```python # 在文件开头添加以下导入 import torch import torchvision import torchaudio import tensorboard # 确保已安装tensorboard模块 # 在Analysis部分进行配置 a = Analysis( ['main.py'], pathex=[], binaries=[], datas=[ # 可以添加数据文件,如模型文件等 ], hiddenimports=[ # 添加隐藏导入的模块 'torch', 'torch._C', 'torch.nn', 'torchvision', 'tensorboard', 'tensorflow', # 有时tensorboard需要tensorflow(即使我们不用,但tensorboard可能依赖) 'tensorboardX', # 如果有其他缺失模块,在此添加 ], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, # 尝试设置为False以避免重定向问题 win_private_assemblies=False, cipher=None, noarchive=False, ) ``` #### 步骤三:处理用警告 在`.spec`文件中,我们可以通过`excludes`参数排除一些用的模块(如果不需要)来避免警告。但是,由于我们不确定具体是哪个模块引起的用警告,可以先尝试打包,然后根据警告信息排除。 例如,如果警告提到某个模块(如`torch.legacy`)已经用,我们可以将其排除: ```python excludes=['torch.legacy'], ``` #### 步骤四:处理重定向问题 对于Windows或MacOS的重定向不支持问题,我们可以尝试以下方法: 1. 更新PyInstaller到最新版本:`pip install --upgrade pyinstaller` 2.`.spec`文件中,设置`win_no_prefer_redirects=False`(如上所示) 3. 如果问题仍然存在,尝试在打包命令中加上`--win-private-assemblies``--win-no-prefer-redirects`选项(但注意,这些选项在PyInstaller 4.0后有变化) 另外一种思路:重定向问题可能与控制台有关,如果我们不需要控制台窗口,可以尝试使用`--console``--noconsole`参数调整。 #### 步骤五:打包 使用修改后的`.spec`文件打包: ```bash pyinstaller main.spec ``` ### 补充说明:tensorboard问题的替代方案 如果上述方法仍然无法解决tensorboard的问题,我们可以尝试在代码中动态导入tensorboard,以触发PyInstaller的自动捕获: ```python # 在main.py的开头添加以下代码 try: import tensorboard import tensorboardX except ImportError: pass ``` ### 验证打包结果 运行打包后的可执行文件,检查是否还会出现`ModuleNotFoundError`以及用警告和重定向问题。 ### 相关问题 1. 如何在PyInstaller打包过程中处理动态导入的模块? 2. 如何排除PyInstaller打包过程中不需要的模块以减小体积? 3. 如何解决PyInstaller打包后的程序在Windows系统上的控制台窗口问题? 4. 如何将资源文件(如图片、模型等)正确打包到PyInstaller生成的可执行文件中? 5. PyInstaller打包时如何加密源代码? ### 引用说明 本文参考了PyInstaller处理隐藏导入的一般方法[^2]以及修改.spec文件的高级配置技巧[^3],并针对tensorboard模块缺失的问题提出了解决方案。同时,针对重定向问题,我们参考了PyInstaller官方文档中关于Windows重定向的设置[^4]。 [^2]: 引用[2]中提到:解决模块缺失(ModuleNotFoundError)可以通过在.spec文件的hiddenimports中添加缺失模块。 [^3]: 引用[3]中提到:打包后的文件路径问题可以通过`sys._MEIPASS`定位临时目录解决,以及使用`--hidden-import`手动指定依赖模块。 [^4]: 引用[4]中提到:PyInstaller的基本打包命令以及一些常用参数的使用。 </think> ### 解决 PyInstaller 打包 Torch 时的三大问题 #### 🔧 一、解决 Tensorboard 模块缺失问题 **问题原因**: PyInstaller 无法自动检测 Torch 的间接依赖 `tensorboard`,导致运行时出现 `ModuleNotFoundError`。 **解决方案**: 1. **显式添加隐藏导入**: ```bash pyinstaller --hidden-import tensorboard --hidden-import tensorboardX main.py ``` *或修改 .spec 文件:* ```python a = Analysis( ... hiddenimports=['tensorboard', 'tensorboardX'] # 添加此处[^2] ) ``` 2. **强制包含缺失模块**: ```python # 在 main.py 开头添加 import tensorboard # 即使未使用也要导入 import tensorboard.summary # 深度依赖 ``` --- #### 二、处理重定向不支持警告 **问题现象**: Windows/MacOS 提示 `Redirects are not supported` 错误。 **解决方案**: 1. **禁用文件重定向**: ```python # 在 main.py 中添加 if sys.platform == 'win32': import ctypes ctypes.windll.kernel32.Wow64DisableWow64FsRedirection(None) ``` 2. **使用管理员权限**: ```bash # Windows 以管理员身份运行 runas /user:Administrator "pyinstaller main.py" ``` 3. **修改打包参数**: ```bash pyinstaller --win-private-assemblies main.py ``` --- #### ️ 三、解决 Torch 用模块警告 **问题表现**: `DeprecationWarning: Using or importing the ABCs from 'collections' instead of 'collections.abc'` **解决方案**: 1. **更新依赖版本**: ```bash pip install --upgrade torch pyinstaller # 确保最新版[^4] ``` 2. **添加运行时钩子**: 创建 `hook-torch.py````python # 解决用警告的核心逻辑 from PyInstaller.utils.hooks import collect_submodules hiddenimports = collect_submodules('torch', filter=lambda x: 'deprecated' not in x) ``` 3. **打包时加载钩子**: ```bash pyinstaller --additional-hooks-dir=. main.py ``` --- ### 📦 完整打包示例(.spec文件) ```python # torch_pack.spec block_cipher = None a = Analysis( ['main.py'], binaries=[ (torch.lib.__path__[0], 'torch/lib') # 包含原生库 ], datas=[ ('model_weights.pth', '.') ], hiddenimports=[ 'tensorboard', 'tensorboardX', 'torch._C._nn', 'torch.overrides' ], # [^2][^3] hookspath=['.'], runtime_hooks=[], excludes=['collections.abc'], # 排除用模块 win_no_prefer_redirects=True # 关闭重定向 ) ``` ### ✅ 验证步骤 1. 检查警告是否消失: ```bash ./dist/main --test 2>&1 | grep "DeprecationWarning" ``` 2. 确认 Tensorboard 加载: ```python # 在代码中添加验证 try: from torch.utils.tensorboard import SummaryWriter except ImportError as e: print(f"加载失败: {str(e)}") ``` --- ### 🌟 关键预防措施 1. **虚拟环境打包**: ```bash python -m venv pack_env && source pack_env/bin/activate pip install torch tensorboard pyinstaller ``` 2. **调试模式输出**: ```bash pyinstaller --log-level DEBUG main.py ``` 3. **依赖树检查**: ```bash pipdeptree | grep -E 'torch|tensorboard' ``` --- ### 📚 相关问题 1. 如何解决 PyInstaller 打包后出现的 `libtorch_cuda.so` 缺失错误? 2. 在 macOS 上打包 PyTorch 程序时如何正确处理 Apple Metal 支持? 3. 如何将 TensorBoard 的日志文件正确打包到 PyInstaller 生成的可执行文件中? 4. 使用 `--onefile` 模式打包大体积 Torch 模型时如何优化启动速度? 5. 如何为 PyInstaller 打包的 Torch 程序添加 CUDA 版本自动检测功能? > 解决方案综合运用了隐藏导入机制[^2]、运行时路径处理[^3]和依赖隔离技术[^4],特别针对 Torch 生态的模块加载特性进行了优化调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码简单说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值