Skip to main content
 首页 » 编程设计

python之tensorflow : "trying to mutate a frozen object",巴泽尔

2025年05月04日21xing901022

终端中的 MacOS high sierra,MBP 2016。

我按照这里的指示操作: https://github.com/tensorflow/models/tree/master/research/syntaxnet ./configure 的所有选项都选择为默认值(并仔细检查所有 python 目录。)。在此之前,所有步骤都已干净地完成:

bazel test ... 
# On Mac, run the following: 
bazel test --linkopt=-headerpad_max_install_names \ 
  dragnn/... syntaxnet/... util/utf8/... 

我假设我应该运行后一行(“bazel test --linkopt”等)。但有趣的是,无论哪种方式,我都得到了相同的结果。

这会抛出大约 10 个错误,每个错误都是相同类型的“试图改变一个卡住的对象”,并得出结论,测试未运行,加载包 dragnn/protos 时出错,并且无法开始构建。

这是错误的一般形式:

syntaxnet>> bazel test --linkopt=-headerpad_max_install_names dragnn/... syntaxnet/... util/utf8/...

.

ERROR: /Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/dragnn/protos/BUILD:35:1: Traceback (most recent call last): File "/Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/dragnn/protos/BUILD", line 35 tf_proto_library_py(name = "data_py_pb2", srcs = ["dat..."]) File "/Users/XXX/Desktop/NLP/syntaxnet/models/research/syntaxnet/syntaxnet/syntaxnet.bzl", line 53, in tf_proto_library_py py_proto_library(name = name, srcs = srcs, srcs_versi...", <5 more arguments>) File "/private/var/tmp/_bazel_XXX/f74e5a21c3ad09aeb110d9de15110035/external/protobuf_archive/protobuf.bzl", line 374, in py_proto_library py_libs += [default_runtime] trying to mutate a frozen object ERROR: package contains errors: dragnn/protos


... [各种 'name = "...pb2"' 文件的相同错误] ...

INFO: Elapsed time: 0.709s FAILED: Build did NOT complete successfully (17 packages loaded) ERROR: Couldn't start the build. Unable to run tests

知道这是怎么回事吗?谢谢。

请您参考如下方法:

此错误表明 py_proto_library 规则实现中存在错误。

tf_proto_library_py 在 syntaxnet.bzl 中定义.它是 py_proto_library 的包装器,由 tf_workspace 定义宏的protobuf_archive规则。

“protobuf_archive”下载 Protobuf 3.3.0,其中包含 //:protobuf.bzl 和错误的 py_proto_library 规则实现:在第 374 行,它试图改变一个不可变对象(immutable对象) py_libs。

确保您使用最新的 Bazel 版本,目前是 0.8.1。

如果问题仍然存在,那么:

  • 我建议提交错误:

    • Protobuf,修复py_proto_library规则
    • TensorFlow,更新 tf_workspace 中的 Protobuf 版本,以及
    • Syntaxnet 在 //research/syntaxnet 中更新他们的 TF 子模块引用到错误修复版本。
  • 作为一种解决方法,也许您可​​以修补 protobuf.bzl。

补丁是改变这些行:

   373    if default_runtime and not default_runtime in py_libs + deps: 
   374      py_libs += [default_runtime] 
   375 
   376    native.py_library( 
   377        name=name, 
   378        srcs=outs+py_extra_srcs, 
   379        deps=py_libs+deps, 
   380        imports=includes, 
   381        **kargs) 

对这些:

   373    if default_runtime and not default_runtime in py_libs + deps: 
   374      py_libs2 = py_libs + [default_runtime] 
   375    else: 
   376      py_libs2 = py_libs 
   377 
   378    native.py_library( 
   379        name=name, 
   380        srcs=outs+py_extra_srcs, 
   381        deps=py_libs2+deps, 
   382        imports=includes, 
   383        **kargs) 

免责声明:这是一个“盲”修复;没试过能不能用。