Python相对导入语法:`from。 import abc.xyz`

时间:2014-01-22 17:20:05

标签: python protocol-buffers

问题:我正在尝试安装a Python3 port of Google Protocol Buffers。当我执行python3 setup.py test时,我收到以下错误:

    File "/[*snip*]/python3-protobuf-master/python/google/protobuf/unittest_custom_options_pb2.py", line 13
    from . import google.protobuf.descriptor_pb2
                        ^
SyntaxError: invalid syntax

然后我在Python3和Python2解释器中尝试了类似的语法并得到了同样的错误:

Python 3.2.3 (default, Jul 23 2012, 16:48:24)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from . import x.y
  File "<stdin>", line 1
    from . import x.y
                   ^
SyntaxError: invalid syntax

问题: from . import abc.xyz何时有效的Python语法,如果有的话?我有兴趣知道我下载的代码是否存在内在错误。

其他:我从this SO question.的答案中选择了GPB的这个Python3端口。它与GPB不是最新的,但我预计它仍然可以正常运行。如果您对GPB的Python3端口有更好的了解,请告诉我。

2 个答案:

答案 0 :(得分:0)

您只能在import之后命名顶级对象或嵌套模块。将x名称移至from子句:

from .x import y

或原始问题:

from .google.protobuf import descriptor_pb2

.proto file in question似乎未正确编译为Python。快速扫描显示this to be the case

void Generator::PrintImports() const {
  for (int i = 0; i < file_->dependency_count(); ++i) {
    string module_name = ModuleName(file_->dependency(i)->name());
    printer_->Print("try:\n");
    printer_->Print("  from . import $module$\n", "module", module_name);
    printer_->Print("except ImportError:\n");
    printer_->Print("  import $module$\n", "module", module_name);
  }
  printer_->Print("\n");
}

您需要向项目提交错误报告。

答案 1 :(得分:0)

此问题已修复:请求请求:https://github.com/openx/python3-protobuf/pull/7