Использование Z3Py с Python 3.3

Моя ситуация

Я установил Microsoft Z3 (Z3 [version 4.3.0 - 64 bit]. (C) 2006) и pyc исполняемых файлов для Python2.

Я написал пакет Python3, которому нужен доступ к функциям z3.

Чтобы иметь возможность использовать pyc двоичные файлы с моим пакетом Python3, я decompyle z3 двоичных файлов применил 2to3.

Моя проблема

Int('string') не работает, потому что Z3Py не может обрабатывать новый <class 'str'>, используемый в качестве аргумента 'string':

>>> import z3; z3.Int('abc')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".\bin\z3.py", line 2931, in Int
    return ArithRef(Z3_mk_const(ctx.ref(), to_symbol(name, ctx), IntSort(ctx).ast), ctx)
  File ".\bin\z3.py", line 72, in to_symbol
    return Z3_mk_string_symbol(_get_ctx(ctx).ref(), s)
  File ".\bin\z3core.py", line 1430, in Z3_mk_string_symbol
    r = lib().Z3_mk_string_symbol(a0, a1)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type

Мои вопросы

  • Немного хакерски нужно сначала decompyle *.pyc файлов Z3. Итак, есть ли исходные коды Z3Py?
  • Существует ли уже существующий порт Z3Py на Python3?
  • Любая другая идея, как заставить Z3Py работать с Python3?

Спасибо. - Если что-то непонятно, пожалуйста, оставьте вопрос в комментарии.


person fdj815    schedule 24.03.2013    source источник
comment
Разве Z3 не с открытым исходным кодом? z3.codeplex.com   -  person Kabie    schedule 24.03.2013
comment
@Kabie В основном да, но в этом репозитории нет версий исходных кодов, совместимых с Python3.   -  person fdj815    schedule 24.03.2013


Ответы (1)


unstable (в разработке) есть поддержка Python 3. Эта функция будет доступна в следующем выпуске Z3 (v4.3.2). Тем временем вы можете создать ветку unstable, используя инструкции, найденные здесь.

person Leonardo de Moura    schedule 24.03.2013
comment
Спасибо за ответ. Но похоже, что он не работает вместе с библиотекой правильно. При вызове метода Python для z3: File ".\build\z3core.py", line 24, in lib raise Z3Exception("init(Z3_LIBRARY_PATH) must be invoked before using Z3-python") — есть идеи? - person fdj815; 25.03.2013
comment
Эта ошибка обычно возникает, когда общий объект Z3 (*.so Linux, *.dylib OSX или *.dll Windows) не может быть найден. Вы должны включить общий объект в свой путь поиска: в Linux вы должны установить переменную среды LD_LIBRARY_PATH. Другой вариант — вызвать init с полным путем к общему объекту Z3. Какую платформу вы используете? - person Leonardo de Moura; 25.03.2013
comment
Предполагается, что этот проект будет работать в среде Windows 7. Мой объект в настоящее время находится в .\build\libz3.dll. Есть ли у меня особая переменная окружения, которую я должен установить в Windows, или есть ли что-то еще, что я могу сделать, чтобы заставить Z3Py найти объект? - person fdj815; 25.03.2013
comment
Вы должны включить путь к libz3.dll в переменную окружения PATH. - person Leonardo de Moura; 26.03.2013
comment
Путь к .\build фактически включен в $PATH. Любая другая причина, по которой может возникнуть это исключение? - person fdj815; 26.03.2013
comment
.\build — относительный путь. Вы включаете фактический путь в PATH. Вы пытались вызвать init('dir\libz3.dll') в своем скрипте Python? Еще одна потенциальная проблема: если вы используете 32-битный python.exe, вы должны использовать 32-битную DLL, даже если вы используете 64-битную машину. - person Leonardo de Moura; 26.03.2013
comment
(1) Я использую абсолютный путь C:\[PathTo]\build в $PATH(2) z3.init(libpath) выдает File ".\Python\3.3\lib\ctypes\__init__.py", line 353, in __init__ self._handle = _dlopen(self._name, mode) OSError: [WinError 126] The specific module could not be found. – (3) Я использую Python 3.3.0 [MSC v.1600 64 bit (AMD64)] on win32 вместе с libz3.dll, созданным nmake. – Спасибо, надеюсь, эта информация имеет для вас смысл. - person fdj815; 26.03.2013
comment
Я предполагаю, что libz3.dll, вероятно, является 32-битной DLL. Не могли бы вы попытаться снова скомпилировать libz3.dll, используя (64-разрядные) инструкции, которые можно найти здесь: z3.codeplex.com/ - person Leonardo de Moura; 26.03.2013
comment
Другой вариант — использовать предварительно скомпилированную DLL в ночных сборках для 64-битной Windows. Эта ссылка содержит дополнительную информацию: research.microsoft.com/en-us/um/people/leonardo/blog/2013/02/15/ - person Leonardo de Moura; 26.03.2013
comment
Спасибо. Теперь я использую свою самокомпилированную сборку unstable с заменой файла libz3.dll файлом из канала nightly, и пока не сталкивался с какими-либо проблемами. - person fdj815; 26.03.2013