2014-01-22 5 views
0

Вопрос: Я пытаюсь установить a Python3 port of Google Protocol Buffers. Когда я делаю python3 setup.py test я получаю следующее сообщение об ошибке:Синтаксис относительного импорта Python: `from. import abc.xyz`

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, если вообще? Мне интересно знать, является ли этот код, который я загрузил, по своей сути искажен.

Разное: Я выбрал этот порт Python3 ГПБ от ответа на this SO question. Это не уточненный в отношении ГПБ, но я ожидал, что он по-прежнему функционировать. Сообщите мне, знаете ли вы о портах Python3 GPB.

+0

Где что 'unittest_custom_options_pb2.py' файл пришел? ЭТО нет в репозитории [GitHub repository] (https://github.com/openx/python3-protobuf/tree/master/python/google/protobuf), на который вы ссылаетесь. –

+0

Возможно, это автогенерируется из [этого файла] (https://github.com/openx/python3-protobuf/blob/master/src/google/protobuf/unittest_custom_options.proto). –

+0

да, строка 1 каждого из двух файлов-нарушителей говорит '# Сгенерировано компилятором буфера протокола. НЕ ИЗМЕНИТЬ! »Но я отредактировал их в любом случае согласно вашему предложению, и« test.py test »работал правильно. – turbulencetoo

ответ

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"); 
} 

Вам необходимо подать отчет об ошибке с проектом.

Смежные вопросы