Shapely: Não é possível empacotar com pipenv e cx_freeze: OSError: Não foi possível encontrar lib geos_c.dll ou carregar qualquer uma de suas variantes []

Criado em 16 set. 2020  ·  3Comentários  ·  Fonte: Toblerity/Shapely

Comportamento esperado e comportamento real.

Ao congelar meu programa python3.8 em um msi usando cx_freeze, o msi funciona no computador em que foi construído, mas não em outros hosts.
A mensagem de erro é: OSError: Could not find lib geos_c.dll or load any of its variants [].

Etapas para reproduzir o problema.

Pipfile:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[packages]
cx_Freeze = "==6.2"
shapely = "==1.7.1"

[requires]
python_version = "3.8"

[scripts]
build = "python setup.py bdist_msi"

setup.py:

from cx_Freeze import setup, Executable

if __name__ == "__main__":
    APP = Executable(
        script="test.py",
        base=None,
        targetName="test",  # executable name avaiable in cli after installation
    )

    setup(
        name="test",
        options={
            "build_exe": {},
            "bdist_msi": {
                "add_to_path": True,
                "all_users": True,  # require admin rights
            },
        },
        executables=[APP],
    )

teste.py:

from shapely.geometry import LineString

pallet_line_string = LineString(
    [
        (0, 0),
        (10, 0),
        (10, 20),
        (0, 20),
        (0, 0),
    ]
)
print(pallet_line_string)

Sistema operacional

Windows 10

Versão bem torneada e proveniência

1.7.1 instalado do PyPI usando pipenv

invalid

Comentários muito úteis

A mensagem de erro era enganosa: o geos_c.dll foi de fato encontrado, mas não são dependências. Eu tive que instalar o VC Redistributables da Microsoft para fazê-lo funcionar.
Obrigado!

Todos 3 comentários

@ypicard Sinto muito pelo problema, mas este não é um problema bem-feito. Você deve descobrir como incluir um geos_c.dll compatível em seu pacote. Aqui está como fazemos isso para rodas bem torneadas construídas no appveyor: https://github.com/Toblerity/Shapely/blob/maint-1.7/appveyor.yml#L84.

O problema é que as dlls já estão empacotadas corretamente. Eu posso encontrá-los no diretório de instalação do meu programa ( C:\Program Files (x86)\my_program\lib\shapely\DLLs ). Eles parecem estar corretamente agrupados.
O problema é que o shapely não consegue carregá-los corretamente. Eu imprimi o caminho em geos.py:166 e egg_dlls e wininst_dlls parecem corretos.
O que está acontecendo ?

A mensagem de erro era enganosa: o geos_c.dll foi de fato encontrado, mas não são dependências. Eu tive que instalar o VC Redistributables da Microsoft para fazê-lo funcionar.
Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

FuriousRococo picture FuriousRococo  ·  5Comentários

chivasblue picture chivasblue  ·  3Comentários

romainfontaine picture romainfontaine  ·  5Comentários

ispmarin picture ispmarin  ·  3Comentários

akadouri picture akadouri  ·  4Comentários