ルート解析レイヤーの作成 (Make Route Analysis Layer) (Network Analyst)

サマリー

ルート ネットワーク解析レイヤー」を作成し、解析プロパティを設定します。 ルート ネットワーク解析レイヤーは、指定したネットワーク コストに基づいて、ネットワーク ロケーション間の最適ルートを決定する際に役立ちます。 このレイヤーを作成するには、ローカル ネットワーク データセットを使用するか、オンラインでホストされたルート サービスまたはポータル内のルート サービスを使用します。

使用法

  • このツールで解析レイヤーを作成した後は、[ロケーションの追加 (Add Locations)] ツールを使用して解析レイヤーにネットワーク解析オブジェクトを追加し、[解析の実行 (Solve)] ツールを使用して解析を実行し、[レイヤー ファイルの保存 (Save To Layer File)] ツールを使用して結果をディスクに保存することができます。

  • このツールをジオプロセシング モデルに使用するときは、モデルをツールとして動作させる場合、出力ネットワーク解析レイヤーにモデル パラメーターを作成する必要があります。そうしないと、出力レイヤーはマップのコンテンツに追加されません。

  • ArcGIS AllSource では、ネットワーク解析レイヤーのデータは、ディスク上のファイル ジオデータベースのフィーチャクラスに格納されます。 プロジェクトでネットワーク解析レイヤーを作成する場合、レイヤーのデータは、「現在のワークスペース」環境の新しいフィーチャ データセット内に作成されます。 Python スクリプトでネットワーク解析レイヤーを作成する場合、まず arcpy.env.workspace = "<path to file gdb>" を使用して、ワークスペース環境をレイヤーのデータが格納するファイル ジオデータベースに明示的に設定する必要があります。 レイヤーが作成されるとき、適切なサブレイヤーのフィーチャクラスを含む新しいフィーチャ データセットがこのファイル ジオデータベースに追加されます。

パラメーター

ラベル説明データ タイプ
ネットワーク データ ソース

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer;String
レイヤー名
(オプション)

作成するネットワーク解析レイヤーの名前。

String
移動モード
(オプション)

解析で使用する移動モードの名前。 「移動モード」は、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。

arcpy.na.TravelMode」オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

String
順序
(オプション)

最適ルートの計算時に、入力ストップを特定の順序で巡回する必要があるかどうかを指定します。 このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。

  • 現在の順序を使用入力の順序に従って、ストップを巡回します。 これがデフォルトです。
  • 最適な順序を検索最適ルートを検索するためにストップの順番を並べ替えます。 このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。
  • 最初と最後のストップを維持入力の順序に従って最初と最後のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
  • 最初のストップを維持入力の順序に従って最初のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
  • 最後のストップを維持入力の順序に従って最後のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
String
時刻
(オプション)

ルートの開始日時。 ルートの開始時間は一般的に、1 日の時刻に応じて変化するインピーダンス属性に基づいたルートの検索に使用されます。 たとえば、混雑時の交通量を考慮したルートの検索では、開始時間として午前 7 時を使用します。 このパラメーターのデフォルト値は、午前 8 時です。 日付と時刻は 2005/10/21 10:30 のように指定できます。ルートが複数日にわたり、開始時間のみが指定されている場合は、現在の日付が使用されます。

解析後、出力ルートにはルートの開始時刻と終了時刻が挿入されます。 これらの開始時刻と終了時刻は、ルート案内の生成時にも使用されます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
タイム ゾーン
(オプション)

[時刻] パラメーターのタイム ゾーンを指定します。

  • ロケーションのローカル タイム[時刻] パラメーターが、ルートの最初のストップがある場所のタイム ゾーンを表します。 これがデフォルトです。多くのルートを生成していて、それらが複数のタイム ゾーンで開始される場合、それぞれの開始時間は UTC (協定世界時) でずれが発生します。 たとえば、1 月 2 日の [時刻] の値が午前 10 時 の場合、 東部標準時ゾーンで開始されるルートは開始時間が東部標準時の 10:00 a.m. (3:00 p.m. UTC)、中央標準時ゾーンで開始されるルートは開始時間が中央標準時の 10:00 a.m. (4:00 p.m. UTC) になります。 開始時間が UTC では 1 時間異なります。出力ストップ フィーチャクラスに記録される到着日時と出発日時は、各ルートの最初のストップがある場所のタイム ゾーンです。
  • UTC[時刻] パラメーターが、UTC (協定世界時) を参照します。 特定の時刻 (たとえば今) におけるルートを生成する場合で、最初のストップがある場所のタイム ゾーンがわからない場合、このオプションを選択します。多くのルートを生成していて、それらが複数のタイム ゾーンにまたがっている場合、UTC での開始時間は同時です。 たとえば、1 月 2 日の [時刻] の値が午前 10 時 の場合、 東部標準時ゾーンで開始されるルートは開始時間が東部標準時の 5:00 a.m. (10:00 a.m. UTC)、中央標準時ゾーンで開始されるルートは開始時間が中央標準時の 4:00 a.m. (10:00 a.m. UTC) になります。 どちらのルートも午前 10 時 UTC に開始されます。出力ストップ フィーチャクラスに記録される到着日時と出発日時は UTC です。
String
ライン形状
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

  • ネットワーク沿い出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • ラインなし出力ルートに形状は生成されません。
  • 直線出力ルート形状はストップ間を結ぶ 1 本の直線になります。
String
累積属性
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、指定されている移動モードで使用されるコスト属性のみが使用されます。

累積されるコスト属性ごとに、ネットワーク解析の出力フィーチャに Total_[Impedance] プロパティが入力されます。

このパラメーターは、ネットワーク データ ソースが ArcGIS Online サービスであるか、ネットワーク データ ソースが累積をサポートしていないバージョンの Portal for ArcGIS のサービスである場合には使用できません。

String
解析時にルート案内を生成
(オプション)

解析の実行時にルート案内を生成するかどうかを指定します。

  • オン - 解析時にルート案内が生成されます。 これがデフォルトです。
  • オフ - 解析時にルート案内が生成されません。

ルート案内を生成する必要のない解析では、このオプションをオフのままにすると、解析にかかる時間が短縮されます。

Boolean
時間フィールドのタイム ゾーン
(オプション)

タイム ウィンドウに使用されるフィールドなど、入力テーブルに含まれる時間フィールドを解釈するために使用されるタイム ゾーンを指定します。

  • ロケーションのローカル タイムストップのタイム フィールド内の日時は、ストップがある場所のタイム ゾーンに従って解釈されます。 これがデフォルトです。
  • UTCストップのタイム フィールド内の日時は、UTC (協定世界時) を参照します。
String
解析時に無効なロケーションを除外
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。 通常、「ネットワーク上に配置」できないロケーションは無効です。 無効なロケーションを除外する場合は、そのロケーションがスキップされ、残りのロケーションを使用して解析が実行されます。

  • オン - 無効な入力ロケーションが除外され、有効なロケーションだけが使用されます。 これがデフォルトです。
  • オフ - すべての入力ロケーションが使用されます。 ロケーションが無効な場合は、解析が正常に実行されません。
Boolean

派生した出力

ラベル説明データ タイプ
Network Analyst レイヤー

出力ネットワーク解析レイヤー。

Network Analyst Layer

arcpy.management.MakeRouteAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {sequence}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes}, {generate_directions_on_solve}, {time_zone_for_time_fields}, {ignore_invalid_locations})
名前説明データ タイプ
network_data_source

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer;String
layer_name
(オプション)

作成するネットワーク解析レイヤーの名前。

String
travel_mode
(オプション)

解析で使用する移動モードの名前。 「移動モード」は、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。

arcpy.na.TravelMode」オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

String
sequence
(オプション)

最適ルートの計算時に、入力ストップを特定の順序で巡回する必要があるかどうかを指定します。 このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。

  • USE_CURRENT_ORDER入力の順序に従って、ストップを巡回します。 これがデフォルトです。
  • FIND_BEST_ORDER最適ルートを検索するためにストップの順番を並べ替えます。 このオプションにより、ルート解析は最短パス問題から巡回セールスマン問題に変わります。
  • PRESERVE_BOTH入力の順序に従って最初と最後のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
  • PRESERVE_FIRST入力の順序に従って最初のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
  • PRESERVE_LAST入力の順序に従って最後のストップを維持します。 最適ルートを検索するために残りのストップの順番を並べ替えます。
String
time_of_day
(オプション)

ルートの開始日時。 ルートの開始時間は一般的に、1 日の時刻に応じて変化するインピーダンス属性に基づいたルートの検索に使用されます。 たとえば、混雑時の交通量を考慮したルートの検索では、開始時間として午前 7 時を使用します。 このパラメーターのデフォルト値は、午前 8 時です。 日付と時刻は 2005/10/21 10:30 のように指定できます。ルートが複数日にわたり、開始時間のみが指定されている場合は、現在の日付が使用されます。

解析後、出力ルートにはルートの開始時刻と終了時刻が挿入されます。 これらの開始時刻と終了時刻は、ルート案内の生成時にも使用されます。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
time_zone
(オプション)

time_of_day パラメーターのタイム ゾーンを指定します。

  • LOCAL_TIME_AT_LOCATIONStime_of_day パラメーターが、ルートの最初のストップがある場所のタイム ゾーンを表します。 これがデフォルトです。多くのルートを生成していて、それらが複数のタイム ゾーンで開始される場合、それぞれの開始時間は UTC (協定世界時) でずれが発生します。 たとえば、time_of_day の値が 10:00 a.m. の場合、 東部標準時ゾーンで開始されるルートは開始時間が東部標準時の 10:00 a.m. (3:00 p.m. UTC)、中央標準時ゾーンで開始されるルートは開始時間が中央標準時の 10:00 a.m. (4:00 p.m. UTC) になります。 開始時間が UTC では 1 時間異なります。出力ストップ フィーチャクラスに記録される到着日時と出発日時は、各ルートの最初のストップがある場所のタイム ゾーンです。
  • UTCtime_of_day パラメーターが、UTC (協定世界時) を参照します。 特定の時刻 (たとえば今) におけるルートを生成する場合で、最初のストップがある場所のタイム ゾーンがわからない場合、このオプションを選択します。多くのルートを生成していて、それらが複数のタイム ゾーンにまたがっている場合、UTC での開始時間は同時です。 たとえば、time_of_day の値が 10:00 a.m. の場合、 東部標準時ゾーンで開始されるルートは開始時間が東部標準時の 5:00 a.m. (10:00 a.m. UTC)、中央標準時ゾーンで開始されるルートは開始時間が中央標準時の 4:00 a.m. (10:00 a.m. UTC) になります。 どちらのルートも午前 10 時 UTC に開始されます。出力ストップ フィーチャクラスに記録される到着日時と出発日時は UTC です。
String
line_shape
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

  • ALONG_NETWORK出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • NO_LINES出力ルートに形状は生成されません。
  • STRAIGHT_LINES出力ルート形状はストップ間を結ぶ 1 本の直線になります。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

String
accumulate_attributes
[accumulate_attributes,...]
(オプション)

解析中に累積されるコスト属性のリスト。 これらの累積属性は、参考情報としてのみ使用されます。解析では、指定されている移動モードで使用されるコスト属性のみが使用されます。

累積されるコスト属性ごとに、ネットワーク解析の出力フィーチャに Total_[Impedance] プロパティが入力されます。

このパラメーターは、ネットワーク データ ソースが ArcGIS Online サービスであるか、ネットワーク データ ソースが累積をサポートしていないバージョンの Portal for ArcGIS のサービスである場合には使用できません。

String
generate_directions_on_solve
(オプション)

解析の実行時にルート案内を生成するかどうかを指定します。

  • DIRECTIONS解析時にルート案内が生成されます。 これがデフォルトです。
  • NO_DIRECTIONS解析時にルート案内が生成されません。

ルート案内を生成する必要のない解析では、NO_DIRECTIONS オプションを使用すると、解析にかかる時間が短縮されます。

Boolean
time_zone_for_time_fields
(オプション)

タイム ウィンドウに使用されるフィールドなど、入力テーブルに含まれる時間フィールドを解釈するために使用されるタイム ゾーンを指定します。

  • LOCAL_TIME_AT_LOCATIONSストップのタイム フィールド内の日時は、ストップがある場所のタイム ゾーンに従って解釈されます。 これがデフォルトです。
  • UTCストップのタイム フィールド内の日時は、UTC (協定世界時) を参照します。
String
ignore_invalid_locations
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。 通常、「ネットワーク上に配置」できないロケーションは無効です。 無効なロケーションを除外する場合は、そのロケーションがスキップされ、残りのロケーションを使用して解析が実行されます。

  • SKIP無効な入力ロケーションが除外され、有効なロケーションだけが使用されます。 これがデフォルトです。
  • HALTすべての入力ロケーションが使用されます。 ロケーションが無効な場合は、解析が正常に実行されません。
Boolean

派生した出力

名前説明データ タイプ
out_network_analysis_layer

出力ネットワーク解析レイヤー。

Network Analyst Layer

コードのサンプル

MakeRouteAnalysisLayer の例 1 (Python ウィンドウ)

必須パラメーターのみを使用してツールを実行します。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeRouteAnalysisLayer(network, "WorkRoute")
MakeRouteAnalysisLayer の例 2 (Python ウィンドウ)

すべてのパラメーターを使用してツールを実行します。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeRouteAnalysisLayer(network, "InspectionRoute", "Driving Time",
                        "FIND_BEST_ORDER", "1/1/1900 9:00 AM", "UTC",
                        "ALONG_NETWORK", ["Meters", "TravelTime"])
MakeRouteAnalysisLayer の例 3 (ワークフロー)

次のスタンドアロン Python スクリプトは、MakeRouteAnalysisLayer 関数を使用して、ジオコーディングされたストップ ロケーションを巡回する最適ルートを検索する方法を示しています。

# Name: MakeRouteAnalysisLayer_Workflow.py
# Description: Find a best route to visit the stop locations and save the
#              route to a layer file. The stop locations are geocoded from a
#              text file containing the addresses.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "BestRoute"
    travel_mode = "Driving Time"
    address_locator = "C:/Data/SanFranciscoLocator"
    address_table = "C:/Data/StopAddresses.csv"
    address_fields = "Street Address;City City;State State;ZIP <None>"
    out_stops = "GeocodedStops"
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new Route layer. For this scenario, the default values for all the
    #remaining parameters statisfy the analysis requirements
    result_object = arcpy.na.MakeRouteAnalysisLayer(network, layer_name,
                                                                    travel_mode)

    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]

    #Geocode the stop locations from a csv file containing the addresses.
    #The Geocode Addresses tool can use a text or csv file as input table
    #as long as the first line in the file contains the field names.
    arcpy.geocoding.GeocodeAddresses(address_table, address_locator,
                                     address_fields, out_stops)

    #Load the geocoded address locations as stops mapping the address field from
    #geocoded stop features as Name property using field mappings.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                            stops_layer_name)
    field_mappings["Name"].mappedFieldName = "Address"
    arcpy.na.AddLocations(layer_object, stops_layer_name, out_stops,
                            field_mappings, "")

    #Solve the route layer, ignoring any invalid locations such as those that
    #cannot be geocoded
    arcpy.na.Solve(layer_object, "SKIP")

    #Save the solved route layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))
MakeRouteAnalysisLayer の例 4 (ワークフロー)

この例では、1 つの解析で複数のルートを作成する方法を示します。この方法は、起点と終点の間の距離または運転時間を計算するのに便利です。

レガシー:

GetNASublayer」関数を使用して、ネットワーク解析レイヤーのサブレイヤーを取得できます。 これは ArcGIS Pro 2.7 で導入されました。 以前のソフトウェア バージョンでは、サブレイヤー名をワイルドカードとして使用するネットワーク解析の「Layer」オブジェクトの listLayers メソッドを使用することがネットワーク解析レイヤーのサブレイヤー オブジェクトを取得する最適な方法でした。

# Name: MakeRouteAnalysisLayer_MultiRouteWorkflow.py
# Description: Calculate the home-work commutes for a set of people and save
#              the output to a feature class
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import datetime
import os

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    stops_home = os.path.join(input_gdb, "Analysis", "Commuters_Home")
    stops_work = os.path.join(input_gdb, "Analysis", "Commuters_Work")
    layer_name = "Commuters"
    out_routes_featureclass = "Commuter_Routes"
    travel_mode = "Driving Time"

    #Set the time of day for the analysis to 8AM on a generic Monday.
    start_time = datetime.datetime(1900, 1, 1, 8, 0, 0)

    #Create a new Route layer.  Optimize on driving time, but compute the
    #distance traveled by accumulating the Meters attribute.
    result_object = arcpy.na.MakeRouteAnalysisLayer(network, layer_name,
                                        travel_mode, time_of_day=start_time,
                                        accumulate_attributes=["Meters"])

    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]
    routes_layer_name = sublayer_names["Routes"]

    #Before loading the commuters' home and work locations as route stops, set
    #up field mapping.  Map the "Commuter_Name" field from the input data to
    #the RouteName property in the Stops sublayer, which ensures that each
    #unique Commuter_Name will be placed in a separate route.  Matching
    #Commuter_Names from stops_home and stops_work will end up in the same
    #route.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object, stops_layer_name)
    field_mappings["RouteName"].mappedFieldName = "Commuter_Name"

    #Add the commuters' home and work locations as Stops. The same field mapping
    #works for both input feature classes because they both have a field called
    #"Commuter_Name"
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_home,
                        field_mappings, "")
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_work,
                        field_mappings, "", append="APPEND")

    #Solve the route layer.
    arcpy.na.Solve(layer_object)

    # Get the output Routes sublayer and save it to a feature class
    routes_sublayer = arcpy.na.GetNASublayer(layer_object, "Routes")
    arcpy.management.CopyFeatures(routes_sublayer, out_routes_featureclass)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))