AWS EC2 Mac实例执行shell脚本无法导入pxr模块求助
解决AWS EC2 mac2.metal实例上Node.js子进程执行usdzconvert脚本找不到pxr模块的问题
核心原因
Node.js子进程默认不会加载用户shell的配置文件(如~/.zshrc),且脚本中的路径计算、环境变量设置可能与实际执行环境不匹配,导致Python无法定位到pxr模块。
具体解决步骤
修正脚本的BASEPATH计算逻辑
当Node.js从非脚本所在目录调用该shell脚本时,dirname "$0"可能返回相对路径或错误的绝对路径。建议改用绝对路径定义BASEPATH,或在Node.js调用子进程时指定cwd参数为脚本所在目录。
示例修改后的脚本:#!/bin/sh # 用readlink -f获取脚本绝对路径,避免相对路径问题 BASEPATH=$(dirname "$(readlink -f "$0")") export PATH=$PATH:$BASEPATH/USD:$BASEPATH/usdzconvert export PYTHONPATH=$PYTHONPATH:$BASEPATH/USD/lib/python # 新增调试打印,确认路径是否正确 echo "PYTHONPATH: $PYTHONPATH" echo "BASEPATH: $BASEPATH" usdzconvert ../tmp/$2 ../tmp/$1显式指定Python解释器路径
避免系统默认Python版本干扰,先在终端执行which python3.7拿到目标版本的绝对路径,然后修改脚本调用逻辑:
要么直接修改usdzconvert脚本的shebang行:# 在usdzconvert脚本开头替换为正确路径 #!/usr/local/bin/python3.7要么在shell脚本中用绝对路径调用:
/usr/local/bin/python3.7 $BASEPATH/usdzconvert/usdzconvert ../tmp/$2 ../tmp/$1在Node.js子进程中传递完整环境变量
用child_process.spawn或exec调用脚本时,将终端中生效的环境变量传递给子进程,或手动合并必要变量:
示例Node.js代码:const { spawn } = require('child_process'); const scriptPath = '/path/to/your/script.sh'; // 合并当前进程环境变量与需要的PYTHONPATH const env = { ...process.env, PYTHONPATH: '/path/to/USD/lib/python:' + (process.env.PYTHONPATH || '') }; // 若需要加载shell配置,可指定zsh并预加载配置文件 const child = spawn('/bin/zsh', ['-c', 'source ~/.zshrc && ' + scriptPath + ' arg1 arg2'], { env }); // 捕获输出用于调试 child.stdout.on('data', (data) => console.log(`stdout: ${data}`)); child.stderr.on('data', (data) => console.error(`stderr: ${data}`));调试环境变量差异
在脚本中添加调试命令,对比终端与子进程执行时的环境差异:# 在脚本中新增以下内容 echo "当前shell: $SHELL" echo "Python路径: $(which python)" python -c "import sys; print('Python版本:', sys.version); print('sys.path:', sys.path)"将脚本输出与终端直接执行的结果对比,定位路径或环境变量的差异点。
内容的提问来源于stack exchange,提问作者user21230588
相关产品推荐
相关产品推荐

