cx_freezeを使用してpython3.8プログラムをmsiにフリーズすると、msiはそれが構築されたコンピューターで機能しますが、他のホストでは機能しません。
エラーメッセージは次のとおりです: OSError: Could not find lib geos_c.dll or load any of its variants [].
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],
)
test.py:
from shapely.geometry import LineString
pallet_line_string = LineString(
[
(0, 0),
(10, 0),
(10, 20),
(0, 20),
(0, 0),
]
)
print(pallet_line_string)
ウィンドウズ10
1.7.1は、pipenvを使用してPyPIからインストールされます
@ypicardトラブルについて申し訳ありませんが、これは形の良い問題ではありません。 互換性のあるgeos_c.dllをバンドルに含める方法を検討する必要があります。 これが、appveyor上に構築されたシェイプのあるホイールに対して行う方法です: https://github.com/Toblerity/Shapely/blob/maint-1.7/appveyor.yml#L84。
問題は、dllがすでに正しくパッケージ化されているということです。 それらは私のプログラムのインストールディレクトリ( C:\Program Files (x86)\my_program\lib\shapely\DLLs
)にあります。 それらは正しくバンドルされているようです。
問題は、それらを正しくロードできないことです。 パスをgeos.py:166
で印刷しましたが、 egg_dlls
とwininst_dlls
の両方が正しく表示されます。
何が起こっている ?
エラーメッセージは誤解を招くものでしたgeos_c.dll
は実際に見つかりましたが、依存関係ではありません。 動作させるには、MicrosoftのVC再頒布可能パッケージをインストールする必要がありました。
ありがとう!
最も参考になるコメント
エラーメッセージは誤解を招くものでした
geos_c.dll
は実際に見つかりましたが、依存関係ではありません。 動作させるには、MicrosoftのVC再頒布可能パッケージをインストールする必要がありました。ありがとう!