Использование Pymunk с Pyinstaller

Я буквально ничего не нашел в гугле, что могло бы помочь. Даже для py2exe, но я бы хотел использовать pyinstaller.

Моя проблема в том, что модуль (pymunk [он же Chipmunk]) не полностью включен в сборку exe. Вероятно, отсутствует какая-то dll. В основном отсутствует зависимость, которую я не знаю, как решить.

Failed to load pymunk library.

This error usually means that you don't have a compiled version of chipmunk in
the correct spot where pymunk can find it. pymunk does not include precompiled
chipmunk library files for all platforms.

The good news is that it is usually enough (at least on *nix and OS X) to
simply run the compile command first before installing and then retry again:

You compile chipmunk with
> python setup.py build_chipmunk
and then continue as usual with
> python setup.py install
> cd examples
> python basic_test.py

(for complete instructions please see the readme file)

If it still doesnt work, please report as a bug on the issue tracker at
http://code.google.com/p/pymunk/issues
Remember to include information about your OS, which version of python you use
and the version of pymunk you tried to run. A description of what you did to
trigger the error is also good. Please include the exception traceback if any
(usually found below this message).

Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "C:\python26\lib\site-packages\PyInstaller\loader\iu.py", line 386, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "C:\python26\lib\site-packages\PyInstaller\loader\iu.py", line 480, in doimport
    exec co in mod.__dict__
  File ".\build\pyi.win32\CollisionUtil\out00-PYZ.pyz\pymunk", line 53, in <module>
  File "C:\python26\lib\site-packages\PyInstaller\loader\iu.py", line 431, in importHook
    mod = self.doimport(nm, ctx, ctx + '.' + nm)
  File "C:\python26\lib\site-packages\PyInstaller\loader\iu.py", line 480, in doimport
    exec co in mod.__dict__
  File ".\build\pyi.win32\CollisionUtil\out00-PYZ.pyz\pymunk._chipmunk", line 14, in <module>
  File ".\build\pyi.win32\CollisionUtil\out00-PYZ.pyz\pymunk.libload", line 68, in load_library
  File ".\build\pyi.win32\CollisionUtil\out00-PYZ.pyz\ctypes", line 431, in LoadLibrary
  File ".\build\pyi.win32\CollisionUtil\out00-PYZ.pyz\ctypes", line 353, in __init__
WindowsError: [Error 126] The specified module could not be found

Библиотека Chipmunk была обернута через модуль ctypes, поэтому, поскольку эти сообщения исходят от Chipmunk, предполагается, что она компилируется. Что не помогает мне с точки зрения Python. Может быть нет.

Может ли кто-нибудь сказать мне, как исправить эту зависимость для pyinstaller?


person Kaliber64    schedule 16.02.2013    source источник


Ответы (2)


Вам нужно включить файл chipmunk.dll (и, если вы хотите запустить его на OSX, файл .dylib, а для Linux файлы .so). Один из быстрых хакерских вариантов — просто вручную скопировать его туда, где находится сгенерированный файл .exe. Другой вариант — заставить pyinstaller включить его для вас. Я не эксперт по pyinstaller, но один из способов сделать это — отредактировать файл .spec, который создает pyinstaller.

Что-то вроде:

import os, pymunk
pymunk_dir = os.path.dirname(pymunk.__file__)
chipmunk_libs = [
    ('chipmunk.dll', os.path.join(pymunk_dir, 'chipmunk.dll'), 'DATA'),
]
#... 
coll = COLLECT(exe,
               a.binaries + chipmunk_libs,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name=os.path.join('dist', 'basic_test'))

Я создал полный пример и передал его в ствол pymunk. Взгляните на https://github.com/viblo/pymunk/blob/master/examples/pyinstaller_basic_test.spec (Обратите внимание, что в этом примере в начале немного изменен путь, где он делает sys.path.insert(0,'..'). Учитывая, что ваша программа уже можете найти pymunk, и вы поместите файл спецификации в то же место, где вам не понадобится эта часть.

person viblo    schedule 17.02.2013
comment
РЖУ НЕ МОГУ. Я бы не опубликовал этот вопрос, если бы нашел ту dll, которую искал. Пришел к выводу, что его нет. Я только что нашел его прямо перед проверкой обновлений StackExchance XD. Ставлю рядом с exe и все хорошо. Спасибо за пример, обязательно попробую. - person Kaliber64; 17.02.2013

Я столкнулся с той же проблемой, используя pyinstaller с pymunk==6.0.0.

Решение состояло в том, чтобы переименовать файл _chipmunk.pyd в папке pymunk в chipmunk.dll.

Согласно этому ответу, это файлы одного типа, но с другим расширением, этот обходной путь позволил компилятору найти файл и завершить свою задачу. https://stackoverflow.com/questions/8262884/python-c-extension-use-extension-pyd-or-dll#:%7E:text=4%20Answers&text=pyd%20files%20are%20just%20dll,от%20normal%20dlls%2C%20I%20рекомендовать%20.&text=dll%20in%20windows.

person Declan Heard    schedule 28.02.2021
comment
Я попытался собрать exe из программы, сделанной с модулем Arcade. У меня переименование не работает, так как оно нужно файлу с оригинальным именем. Что я сделал, так это скопировал _chipmunk.pyd, а затем переименовал его в chipmunk.dll. Я бы не придумал это без этого ответа, спасибо c: - person Dante S.; 30.03.2021