无法在Heroku上使用Flask和Shapely运行应用

4 投票
1 回答
581 浏览
提问于 2025-04-17 16:09

我开发了一个小应用,需要用到Shapely这个Python库。我在Windows上通过.exe文件安装了它,这样就自动把需要的DLL文件(geos.dll和geos_c.dll)放到了Python27\Lib\site-packages\shapely\DLLs文件夹里。

当我尝试在我的电脑上创建一个虚拟环境时,我通过pip安装了Shapely,但它没有把那些DLL文件放进去,所以我遇到了这个错误:

from shapely.geos import lgeos
File "...\lib\site-packages\shapely\geos.py", line 71, in <module>
_lgeos = CDLL("geos.dll")
File "C:\Python27\Lib\ctypes\__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found

于是我手动把那两个DLL文件放到了虚拟环境的Lib\site-packages\shapely\DLLs文件夹里,这样就解决了问题。

现在我想把这个应用部署到Heroku上,但又失败了,出现了以下错误:

from shapely.geos import lgeos
_lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])
file "/app/.heroku/python/lib/python2.7/site-packages/shapely/geos.py", line 44, in     load_dll
from shapely.coords import required
file "/app/.heroku/python/lib/python2.7/site-packages/shapely/geos.py", line 47, in <module>
libname, fallbacks or []))
Error: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so']
Process exited with status 1
State changed from starting to crashed

我猜测是因为缺少那两个DLL文件导致应用崩溃。我把这两个文件复制到一个单独的文件夹里,并通过git上传了它们。

我在应用的根目录下创建了一个.profile文件,用来把这两个文件复制到Python环境中。

.profile

#Copy Shapely DLL Files to Site packages
cp -r $HOME/env_files/DLLs $HOME/.heroku/python/lib/python2.7/site-packages/shapely/

但应用还是因为同样的错误崩溃了。

有没有人能帮我解决这个问题?

1 个回答

0

Heroku使用的是类Unix系统,它支持的是*.so类型的库,而不是*.dll类型的库。

所以你需要删除任何环境变量和dll文件。

我通过pip来安装。

pip install shapely

github安装失败了。

撰写回答