Gỡ lỗi AttributionError: đối tượng 'module' không có thuộc tính 'Parameter' từ Python Toolbox của ArcPy?


8

Tôi có một tập lệnh .pyt lớn (hộp công cụ python) và bây giờ tôi đang thử chia nó thành nhiều tệp (1 tệp - 1 công cụ).

Trong một tệp .pyt, mọi thứ đều hoạt động hoàn hảo, nhưng khi chia tệp, tôi nhận được thông báo này: AttributionError: 'module' object không có thuộc tính 'Parameter'.

Cấu trúc của tập tin:

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]

configureator.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 là rõ ràng

Lỗi của tôi

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'

Tôi theo cấu trúc của bạn chính xác và nó làm việc cho tôi.
DWynne

2 DWynne, phiên bản phần mềm của bạn là gì?
Vladimir Ivanov

Tôi đang ở trên 10.3 (nhưng tôi có thể kiểm tra phiên bản khác đủ dễ dàng). Phiên bản nào bạn đang sử dụng?
DWynne

1
Gặp vấn đề tương tự với ArcGIS 10.3.1 Đã khắc phục bằng cách xóa tất cả các tệp XML được tạo bởi ArcGIS trong thư mục hộp công cụ, khởi động lại ArcGIS và chạy lại công cụ (không phải hình thành cửa sổ kết quả mà bằng cách nhấp vào nó). Vẫn có vẻ là loại ngẫu nhiên.
Thomas

1
Tôi đang thấy điều này trên 10.3.1 rất nhiều, trên các dịch vụ arcpy đa tệp đang hoạt động tốt. Tôi đã lấy các phiên bản trước trở lại từ git hoạt động hoàn hảo, dọn dẹp thư mục, xóa các dịch vụ và tôi vẫn gặp sự cố ngẫu nhiên kỳ lạ.
CMPalmer

Câu trả lời:


10

Đây có thể không phải là nguyên nhân cho tất cả mọi người, nhưng tôi đã xác định được ít nhất một bộ kích hoạt.

  1. Chạy công cụ hộp công cụ Python từ ArcCatalog
  2. Lịch sử địa lý được bật và bao gồm kết quả từ # 1.
  3. Khi bắt đầu phiên ArcCatalog mới, ban đầu không có cửa sổ xử lý địa lý nào được mở (như cửa sổ ArcToolbox, cửa sổ Python, cửa sổ Kết quả).

Nếu tất cả những điều trên là đúng, công cụ hộp công cụ Python sẽ hiển thị AttributeError: 'module' object has no attribute 'Parameter'ngoại lệ.

Xóa lịch sử (hoặc hoàn toàn không đăng nhập) sẽ tránh được vấn đề, có lẽ tại sao tôi không thấy điều này trước đây vì tôi hiếm khi giữ lại lịch sử của mình.

Nhấp chuột phải vào hộp công cụ và sử dụng refresh sẽ xóa lỗi, nhưng nó sẽ xuất hiện trở lại trong tương lai miễn là danh sách trên vẫn đúng. Tuy nhiên, nếu công cụ đang nhập lớp công cụ từ một tệp công cụ riêng biệt (như trường hợp ở trên) thì việc làm mới sẽ không đủ. Vì thế, tôi đã buộc nó bằng cách đưa reloadvào .pyt, và sau đó làm mới trên hộp công cụ sẽ xóa lỗi.

# Using example of toolbox.pyt above
import toolpackage.configurator  # add import
reload(toolpackage.configurator)  # add a forced reload
from toolpackage.configurator import ToolboxConfigurator

Rõ ràng lỗi này vẫn tồn tại ở 10.6-- nó đang khiến tôi phát điên; đổi tên pyt dường như để sửa nó (tạm thời). Sử dụng tải lại không chỉ sửa nó, bây giờ tôi có thể sử dụng refresh để tránh phải liên tục thoát và khởi động lại ArcCatalog khi phát triển mã, THANKS !!
brian h wilson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.