2010-11-24 4 views
4

この非常に短いスクリプトをUbuntuで実行するとsegfaultを受け取ります。PythonでOGR CreateField()を使用した場合のセグメンテーションフォールト(segfault)

from osgeo import ogr, osr 

shpfile = 'Census_County_TIGER00_IN.shp' 

def cust_field(field): 
    '''cust_field(shpfile, field) creates a field definition, which, by calling cust_field(), can be used to create a field using the CreateField() function. 
    cust_field() DOES NOT create a field -- it simply creates a "model" for a field, that can then be called later. It's weird, but that's GDAL/OGR, as far as I can tell.''' 
    fieldDefn = ogr.FieldDefn(field, ogr.OFTInteger) 
    fieldDefn.SetWidth(14) 
    fieldDefn.SetPrecision(6) 
    return fieldDefn 

ds = ogr.Open(shpfile, 1) 
lyr = ds.GetLayerByIndex(0) 
field = cust_field("Test") 
lyr.CreateField(field) 

すべてはその最後の行、iPython、通常のシェルのPythonとIDLEコマンドラインセグメンテーションフォールトのすべてのダンプまでスムーズに実行されます。これは私の最後のエラーか、根底にあるCの問題ですか?私は適切に対処していませんか?

+0

osgeoにバグを報告してください。 Pythonプログラムは決してコアをダンプしてはいけません。 – nmichaels

答えて

5

これが私の最後のエラーまたはIが適切に対処するではない よ基礎となるCの問題 ですか?

おそらく両方です。 GDAL/OGRのバインディングdoは、ときどきセグメンテーションする傾向があります。objects go out of scope and are garbage collected。これは既知のバグですが、すぐに修正される可能性は低いです。

これを回避する方法を見つけることができます。あなたはこのようなスクリプトの体内にcust_field機能をリファクタリングするために一時的に試みることができる

>>> gdal.VersionInfo('') 
'GDAL 1.6.0, released 2008/12/04' 

:私は、Windows XP上の別のシェープファイル、およびGDAL/OGRの次のバージョンで、このセグメンテーションフォルトを再現することはできません

from osgeo import ogr, osr 

shpfile = 'Census_County_TIGER00_IN.shp' 

ds = ogr.Open(shpfile, 1) 
lyr = ds.GetLayerByIndex(0) 
fieldDefn = ogr.FieldDefn("Test", ogr.OFTInteger) 
fieldDefn.SetWidth(14) 
fieldDefn.SetPrecision(6) 

lyr.CreateField(fieldDefn) 

これが問題を解決するかどうか教えてください。

+0

残念ながら、それはしません。私は手動で各行をiPythonに入力しようとしました。そして、iPythonはlyr.CreateField(fieldDefn)行でsegfaultを実行します。 – mattdeboard

+0

@mattdeboardサンプルのシェイプファイルをオンラインのどこかに投稿できますか? – fmark

+0

ここに私が使用している正確なシェイプファイルへのダウンロードリンクがあります。 http://inmap.indiana.edu/downloads/Census_County_TIGER00_IN.zip //さらに、GDBでスクリプトを実行すると、デバッグ情報へのリンクがあります。 http://paste.pocoo.org/show/295344/ //それが問題であれば、私はこれをUbuntuのバーチャルボックスで実行しています。 – mattdeboard

関連する問題