无法在Heroku上使用Flask和Shapely运行应用
我开发了一个小应用,需要用到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安装失败了。