2014-11-20 58 views
0

我在RHEL 6.5上的兩個部署中遇到了這個問題。找不到對谷歌搜索任何答案python 2.7 + RHEL 6.5 + Shapely-1.4.4:MemoryError

基本安裝軟件包

(nout)$ sudo rpm -qa | grep geos 
geos-devel-3.3.2-1.el6.x86_64 
geos-3.3.2-1.el6.x86_64 
geos-python-3.3.2-1.el6.x86_64 

勻稱安裝

(nout)$ easy_install -Z Shapely-1.4.4.tar.gz 
Processing Shapely-1.4.4.tar.gz 
Writing /tmp/easy_install-iLylTY/Shapely-1.4.4/setup.cfg 
Running Shapely-1.4.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-iLylTY/Shapely-1.4.4/egg-dist-tmp-xFmed4 
Numpy or Cython not available, shapely.vectorized submodule not being built. 
shapely/speedups/_speedups.c: In function ‘__pyx_pf_7shapely_8speedups_9_speedups_2geos_linestring_from_py’: 
shapely/speedups/_speedups.c:1603: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c:2087: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c:2553: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c: In function ‘__pyx_pf_7shapely_8speedups_9_speedups_4geos_linearring_from_py’: 
shapely/speedups/_speedups.c:3118: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c:3127: warning: pointer targets in passing argument 3 of ‘GEOSCoordSeq_getSize_r’ differ in signedness 
/usr/include/geos_c.h:321: note: expected ‘unsigned int *’ but argument is of type ‘int *’ 
shapely/speedups/_speedups.c:3614: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c:4158: warning: assignment discards qualifiers from pointer target type 
shapely/speedups/_speedups.c: At top level: 
shapely/speedups/_speedups.c:924: warning: ‘__pyx_f_7shapely_8speedups_9_speedups_get_geos_context_handle’ defined but not used 
shapely/speedups/_speedups.c:1010: warning: ‘__pyx_f_7shapely_8speedups_9_speedups_geos_from_prepared’ defined but not used 
zip_safe flag not set; analyzing archive contents... 
shapely.geos: module references __file__ 
Adding Shapely 1.4.4 to easy-install.pth file 

Python Shell中

(nout)$ python 
Python 2.7.8 (default, Sep 12 2014, 14:39:38) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from shapely.geometry import Polygon, Point 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/geometry/__init__.py", line 4, in <module> 
    from .base import CAP_STYLE, JOIN_STYLE 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/geometry/base.py", line 9, in <module> 
    from shapely.coords import CoordinateSequence 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/coords.py", line 8, in <module> 
    from shapely.geos import lgeos 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/geos.py", line 194, in <module> 
    error_h = EXCEPTION_HANDLER_FUNCTYPE(error_handler) 
MemoryError 

Python Shell中

>>> from shapely.ops import transform 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/ops.py", line 13, in <module> 
    from shapely.geos import lgeos 
    File "/omd/nocout/nout/lib/python2.7/site-packages/Shapely-1.4.4-py2.7-linux-x86_64.egg/shapely/geos.py", line 194, in <module> 
    error_h = EXCEPTION_HANDLER_FUNCTYPE(error_handler) 
MemoryError 

在調用importMemoryError收到

我無法理解的原因。

回答

1

對於RHEL + selinux enabled + /tmp as noexec,試圖訪問和執行/tmp的任何模塊都會生成一個MEMORY ERROR。

在我的情況,/tmpnoexec和SELinux的被實施

/tmp默認爲defaults,noexec,nosuid,nodev

我設置:在看:https://bugzilla.redhat.com/show_bug.cgi?id=645193#c11

$ getsebool -a | grep httpd_tmp_exec 
httpd_tmp_exec --> on 

不過問題依然存在,如果我正確地理解,這是因爲:https://bugzilla.redhat.com/show_bug.cgi?id=582009

The libffi library tries to write to /tmp, 
which isn't allowed for the apache user in a default SELinux config 
(https://bugzilla.redhat.com/show_bug.cgi?id=582009). 
In this environment, importing ctypes always throws a MemoryError 

所以選擇httpd_tmp_exec --> on是沒有用的對我來說。在我看到def _candidate_tempdir_list()

還有,如果有envnames TMPDIRTEMPTMP,Python將皮卡的臨時位置:

我去尋找到蟒蛇LIB文件,搜索/tmp聲明,我發現tempfile.py line 147

要設置哪個變量?爲此我去了libffi源代碼,libffi-3.0.6。文件:src/closures.c行290 open_temp_exec_file_env, "TMPDIR", 0

TMPDIR是被設置的候選人。

我繼續帶安裝/opt/app/tmp,設置export TMPDIR=/opt/app/tmp

做這一切工作正常,直到我用python idle,當我繼續與nginx + uwsgi部署,我被同樣的錯誤caughtup。現在我不確定爲什麼會發生這種情況,我認爲必須是uwsgi執行問題。所以我第一次重新安裝uwsgi,然後我修改了/locationnginx.conf看着:http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_temp_path集:uwsgi_temp_path

我重新啓動所有的服務,nginx的,uwsgi。並嘗試過。有效。

我也首先嚐試:(安全)HACK:Python ctypes MemoryError in fcgi process from PIL library

結果是令人失望的我。