Как мне скомпилировать Pyparsing с помощью Cython в Windows?

Я попытался скомпилировать Pyparsing на моей машине с Windows, но получил следующие ошибки:

python setup.py build_ext --inplace
running build_ext
cythoning pyparsing.pyx to pyparsing.c

Error compiling Cython file:
------------------------------------------------------------
...
If C{include} is set to true, the matched expression is also parsed (the
skipped text
and matched expression are returned as a 2-element list).  The C{ignore}
argument is used to define grammars (typically quoted strings and comment
s) that
might contain false matches.
"""def __init__( self, other, include=False, ignore=None, failOn=None ):
^
------------------------------------------------------------

pyparsing.pyx:2764:31: Expected an identifier, found 'include'

Error compiling Cython file:
------------------------------------------------------------
...
def __init__( self, other, include=False, ignore=None, failOn=None ):
super( SkipTo, self ).__init__( other )
self.ignoreExpr = ignore
self.mayReturnEmpty = True
self.mayIndexError = False
self.includeMatch = include
^
------------------------------------------------------------

pyparsing.pyx:2769:28: Expected an identifier or literal
building 'pyparsing' extension
creating build
creating build\temp.win32-2.7
creating build\temp.win32-2.7\Release
C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe /c /nologo /Ox /MD /W
3 /GS- /DNDEBUG -IC:\Python27\include -IC:\Python27\PC /Tcpyparsing.c /Fobuild\t
emp.win32-2.7\Release\pyparsing.obj
pyparsing.c
pyparsing.c(1) : fatal error C1189: #error :  Do not use this file, it is the re
sult of a failed Cython compilation.
error: command '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe"' fa
iled with exit status 2

Я выполнил компиляцию с использованием Microsoft Visual C ++ 2008 Express, а используемый модуль Pyparsing является самой последней версией. Пожалуйста, кто-нибудь знает, как заставить это работать?

6

Решение

Сэр, я сделал, как вы сказали, но все еще было предупреждение во время компиляции:


python setup.py build_ext --inplace
работает build_ext
cythoning pyparsing.pyx в pyparsing.c
предупреждение: pyparsing.pyx: 413: 8: недоступный код
построение расширения pyparsing
создание сборки
создание сборки \ temp.win32-2.7
создание сборки \ temp.win32-2.7 \ Release
C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ BIN \ cl.exe / c / nologo / Ox / MD / W
3 / GS- / DNDEBUG -IC: \ Python27 \ include -IC: \ Python27 \ PC /Tcpyparsing.c / Fobuild \ t
emp.win32-2.7 \ Release \ pyparsing.obj
pyparsing.c
C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ BIN \ link.exe / DLL / nologo / INCRE
MENTAL: NO / LIBPATH: C: \ Python27 \ libs / LIBPATH: C: \ Python27 \ PCbuild / EXPORT: initpyp
arsing build \ temp.win32-2.7 \ Release \ pyparsing.obj / OUT: C: \ Users \ iProsper \ Desktop
\ pyparsing \ pyparsing.pyd /IMPLIB:build\temp.win32-2.7\Release\pyparsing.lib / MAN
IFESTFILE: построить \ temp.win32-2.7 \ Release \ pyparsing.pyd.manifest
Создание библиотеки build \ temp.win32-2.7 \ Release \ pyparsing.lib и сборка объекта \
temp.win32-2.7 \ Release \ pyparsing.exp
C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ mt.exe -nologo -manifest build
\ temp.win32-2.7 \ Release \ pyparsing.pyd.manifest -outputresource: C: \ Users \ iProsper
\ Desktop \ Pyparsing \ pyparsing.pyd; 2

Предупреждение на самом деле в строке 4: предупреждение: pyparsing.pyx: 413: 8: недоступный код. Затем я изменил строку следующим образом:


def __getattr __ (self, name):
если True: #name не в себе .__ slots__:
если имя в себе .__ tokdict:
если имя не в себе .__ имена:
вернуть себя .__ tokdict [имя] [- 1] [0]
еще:
вернуть ParseResults ([v [0] для v in self .__ tokdict [name]])
еще:
вернуть "" иначе:
возврат Нет

и затем перекомпилировал это. Одна вещь, которую я заметил, заключается в том, что даже с предупреждением и внесенным мною редактированием оба они успешно скомпилировались, но когда я попытался проверить его с помощью следующего кода:


из pyparsing импорта Word, альфы
greet = Word (альфа) + ',' + Word (альфа) + '!'
приветствие = greet.parseString ('Привет, мир!')
печать приветствия

Я получил следующую ошибку:


Traceback (последний вызов был последним):
Файл "C: \ nwaomachux \ build_pyparsing \ checkout.py", строка 1, в
из pyparsing импорта Word, альфы
Файл "pyparsing.pyx", строка 3414, в init pyparsing (pyparsing.c: 100064)
AttributeError: у объекта «builtin_function_or_method» нет атрибута «ANY_VALUE»

Я бы изменил файл дальше и отправил его вам, чтобы проверить, но мне всего несколько часов с Pyparsing, так что я еще не понял полный исходный код.

Я не знаю, каков эффект от перемещения withAttribute.ANY_VALUE = object () к началу def withAttribute (арг,* AttrDict): Функция означать. Пожалуйста, что это за исправление? Благодарю.

5

Другие решения

Я подозреваю, что проблема заключается в использовании ‘include’ в качестве именованного параметра, так как include является зарезервированным ключевым словом C. Попробуйте отредактировать это __init__ рутина для:

def __init__( self, other, include_=False, ignore=None, failOn=None ):
super( SkipTo, self ).__init__( other )
self.ignoreExpr = ignore
self.mayReturnEmpty = True
self.mayIndexError = False
self.includeMatch = include_
self.asList = False
if failOn is not None and isinstance(failOn, basestring):
self.failOn = Literal(failOn)
else:
self.failOn = failOn
self.errmsg = "No match found for "+_ustr(self.expr)

То есть просто добавьте «_» к имени параметра, в списке параметров и в одной строке, которая ссылается на него. Это сделает ваш Python-компилятор немного отличающимся от стандартного выпуска, но я не видел интенсивного использования этого параметра.

Удачи, пожалуйста, напишите в pyparsing wiki Обсуждение на главной странице ваш опыт Cython-izing, и любая информация о том, как это могло ускорить ваш процесс pyparsing.

4

По вопросам рекламы [email protected]