将PyTorch作为子模块接入Bazel项目时出现文件路径无效问题
解决Bazel构建中PyTorch子模块脚本硬编码路径问题
以下是几种无需修改PyTorch子模块源码的解决方法:
方法1:通过genrule指定工作目录
Bazel的genrule支持working_directory参数,可以强制命令在指定目录下执行。把这个目录设为PyTorch子模块的根目录,就能让脚本里的硬编码相对路径指向正确的位置。
假设PyTorch子模块放在项目的third_party/pytorch路径下,生成代码的脚本为tools/generate_code.py,可以在你的BUILD文件中定义如下规则:
genrule( name = "generate_pytorch_code", srcs = ["third_party/pytorch/tools/generate_code.py"], outs = ["generated/pytorch_code.h"], # 替换为你的实际输出路径 working_directory = "third_party/pytorch", cmd = "python tools/generate_code.py --output $(OUTS)", )
执行这个genrule时,Bazel会自动切换到PyTorch子模块根目录,脚本内的os.path.isfile检查就能找到预期的文件。
方法2:在构建命令中手动切换目录
如果你的Bazel版本不支持working_directory(较旧版本),可以在cmd参数里先切换到PyTorch子模块目录,再执行脚本:
genrule( name = "generate_pytorch_code", srcs = ["third_party/pytorch/tools/generate_code.py"], outs = ["generated/pytorch_code.h"], cmd = "cd third_party/pytorch && python tools/generate_code.py --output $(RULEDIR)/../generated/pytorch_code.h", )
这里用$(RULEDIR)来定位输出文件的绝对路径,避免切换目录后输出路径出错。
额外提示
因为你已经在修改PyTorch子模块内的BUILD文件,也可以直接在PyTorch的BUILD规则中应用上述两种方法,调整其内部生成代码的规则执行上下文,这样你的主项目BUILD只需依赖PyTorch子模块的目标即可,无需重复定义genrule。
内容的提问来源于stack exchange,提问作者Victor M
相关产品推荐
相关产品推荐

