Debugging AttributeError: objek 'modul' tidak memiliki atribut 'Parameter' dari Python Toolbox of ArcPy?

8

Saya memiliki skrip .pyt (python toolbox) yang besar dan sekarang saya mencoba membaginya menjadi banyak file (1 file - 1 alat).

Dalam satu file .pyt semuanya berfungsi dengan baik, tetapi ketika file dipisahkan saya mendapatkan pesan ini: AttributeError: objek 'modul' tidak memiliki atribut 'Parameter'.

Struktur file:

My Catalog:
-- toolbox.pyt
-- toolpackage:
---- configurator.py
---- __init__.py

toolbox.pyt:

# This Python file uses the following encoding: utf-8

import arcpy

from toolpackage.configurator import ToolboxConfigurator

class Toolbox(object):
  def __init__(self):
    """Define the toolbox (the name of the toolbox is the name of the .pyt file)."""
    self.label = "label"
    self.alias = "Tools"

    # List of tool classes associated with this toolbox
    self.tools = [ToolboxConfigurator]

configurator.py:

# This Python file uses the following encoding: utf-8

import arcpy

class ToolboxConfigurator(object):

  def __init__(self):
    """Define the tool (tool name is the name of the class)."""
    self.label              = u"config"
    self.description        = u""
    self.canRunInBackground = False

  def getParameterInfo(self):
    """Define parameter definitions"""
    new_config_file   = arcpy.Parameter(
      displayName     = u"?",
      name            = "new_config_file",
      datatype        = "GPBoolean",
      parameterType   = "Optional",
      direction       = "Input")
    parameters = [new_config_file]
    return parameters

  def isLicensed(self):
    """Set whether tool is licensed to execute."""
    return True

  def updateParameters(self, parameters):
    """Modify the values and properties of parameters before internal validation
    is performed.  This method is called whenever a parameter has been changed."""
    return

  def updateMessages(self, parameters):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return

  def execute(self, parameters, messages):
    """The source code of the tool."""

__init__.py jelas.

Kesalahan saya:

Traceback (most recent call last):
  File "C:\tools_v4\toolpackage\configurator.py", line 15, in getParameterInfo
    new_config_file   = arcpy.Parameter(
AttributeError: 'module' object has no attribute 'Parameter'
Vladimir Ivanov
sumber
Saya mengikuti struktur Anda dengan tepat dan itu bekerja untuk saya.
DWynne
2 DWynne, apa versi perangkat lunak Anda?
Vladimir Ivanov
Saya di 10.3 (tapi saya bisa mengecek versi yang berbeda dengan cukup mudah). Versi apa yang Anda gunakan?
DWynne
1
Menjalankan ke masalah yang sama dengan ArcGIS 10.3.1 Memperbaikinya dengan menghapus semua file XML yang dibuat oleh ArcGIS di folder toolbox, me-restart ArcGIS dan Jalankan kembali alat (tidak membentuk jendela hasil tetapi dengan mengkliknya). Sepertinya masih agak acak.
Thomas
1
Saya melihat ini pada 10.3.1 banyak, pada layanan multi file arcpy yang telah bekerja dengan baik. Saya telah menarik versi sebelumnya dari git yang bekerja dengan sempurna, membersihkan direktori, membersihkan layanan, dan saya masih mengalami masalah acak yang aneh.
CMPalmer

Jawaban:

10

Ini mungkin bukan penyebab bagi semua orang, tetapi saya telah mengidentifikasi setidaknya satu set pemicu.

  1. Jalankan alat Python toolbox dari ArcCatalog
  2. Riwayat proses geoproses hidup dan termasuk hasil dari # 1.
  3. Ketika memulai sesi ArcCatalog baru, awalnya tidak ada jendela geoproses yang terbuka (seperti jendela ArcToolbox, jendela Python, jendela Hasil).

Jika semua di atas benar, alat Python toolbox akan menampilkan AttributeError: 'module' object has no attribute 'Parameter'pengecualian.

Menghapus riwayat (atau tidak mencatatnya sama sekali) akan menghindari masalah, mungkin mengapa saya tidak melihat ini sebelumnya karena saya jarang menyimpan riwayat saya.

Mengklik kanan pada kotak alat dan menggunakan refresh akan menghapus kesalahan, tetapi itu akan muncul lagi di masa depan selama daftar di atas tetap benar. Namun, jika alat mengimpor kelas alat dari file alat terpisah (seperti kasus di atas) refresh tidak akan cukup. Untuk itu, saya harus memaksanya dengan memasukkan reloaddalam .pyt, dan kemudian refresh pada toolbox akan menghapus kesalahan.

# Using example of toolbox.pyt above
import toolpackage.configurator  # add import
reload(toolpackage.configurator)  # add a forced reload
from toolpackage.configurator import ToolboxConfigurator
DWynne
sumber
Rupanya bug ini masih ada di 10,6 - itu membuatku gila; mengganti nama pyt sepertinya memperbaikinya (sementara). Menggunakan ulang tidak hanya memperbaikinya, sekarang saya dapat menggunakan refresh untuk menghindari keharusan untuk terus-menerus berhenti dan me-restart ArcCatalog ketika mengembangkan kode, TERIMA KASIH !!
brian h wilson