1

外部から GRASSGIS モジュールを呼び出すpython funciton Aを書きましたが、問題なく動作しました。別の GRASSGIS モジュールと Python 関数Aを呼び出すステートメントを含む別の Python 関数Bを書きましたが、エラーが発生しました。

機能 A:

import os
import sys
import numpy
from GRASSGIS_conn import GRASSGIS_conn


def v_edit(map_name, tool, thresh, coords):

    cor = [",".join(item) for item in coords.astype(str)]
    no_of_cors = len(cor)
    i = 0
    while i <= no_of_cors - 1:
        g.run_command('v.edit', map = map_name, tool = tool, threshold = thresh, coords = cor[i])
        i = i + 1

機能 B:

import sys
import os
import numpy
from GRASSGIS_conn import GRASSGIS_conn
from v_edit import v_edit


def split_line(line_shape, out_name, thresh, point_cor):

    g.run_command('v.in.ogr', overwrite = True, input = line_shape, output = out_name)
    v_edit(out_name, 'break', thresh, point_cor)



if __name__ == "__main__":


    sys.path.append(os.path.join(os.environ['GISBASE'], 'etc', 'python'))
    import grass.script as g
    gisdb = 'C:\Users\Heinz\Documents\grassdata'
    location = 'nl'
    mapset = 'nl'
    GRASSGIS_conn(gisdb, location, mapset)
    point_cor = numpy.genfromtxt('proj_cor.csv', delimiter = ',')
    split_line(r'C:\Users\Heinz\Desktop\all.shp', 'tctest', '50', point_cor)

エラー:

Traceback (most recent call last):
  File "C:\Users\Heinz\Desktop\split_line.py", line 25, in <module>
    split_line(r'C:\Users\Heinz\Desktop\all.shp', 'tctest', '50', point_cor)
  File "C:\Users\Heinz\Desktop\split_line.py", line 11, in split_line
    v_edit(out_name, 'break', thresh, point_cor)
  File "C:\Users\Heinz\Desktop\v_edit.py", line 13, in v_edit
    g.run_command('v.edit', map = map_name, tool = tool, threshold = thresh, coords = cor[i])
NameError: global name 'g' is not defined

そして、関数Aを呼び出すステートメントなしで関数Bがエラーなしで正常に実行されることをテストしました。

なぜこれが起こったのか、どうすれば解決できるのかわかりません。

4

1 に答える 1

1

解決策:import grass.script as g最上位のインポートに from を配置します。つまり、ファイル 1 ( function A- v_edit.py) は次のようになります。

import os
import sys
import numpy
from GRASSGIS_conn import GRASSGIS_conn
import grass.script as g

def v_edit(map_name, tool, thresh, coords):

    cor = [",".join(item) for item in coords.astype(str)]
    no_of_cors = len(cor)
    i = 0
    while i <= no_of_cors - 1:
        g.run_command('v.edit', map = map_name, tool = tool, threshold = thresh, coords = cor[i])
        i = i + 1

原因:ブロックgで定義 (インポート) しましたif __name__ == "__main__"。これは、ファイル コードの一部としてカウントされません。

これを読んでください - name == " main " doの場合はどうなりますか。

于 2016-10-26T13:32:54.917 に答える