Hướng dẫn how do i share data between two python scripts? - làm cách nào để chia sẻ dữ liệu giữa hai tập lệnh python?
Chương này, nhằm vào các lập trình viên Python có kinh nghiệm, giải thích cách trao đổi dữ liệu giữa các tập lệnh bằng khu vực dữ liệu được chia sẻ. Show
Về việc chia sẻ dữ liệu giữa các tập lệnhCó thể chia sẻ dữ liệu giữa các tập lệnh phát triển cấu hình (CDK). Tính năng này có một loạt các ứng dụng, bao gồm khả năng lưu trữ và sử dụng lại dữ liệu hoặc các chức năng thường được sử dụng bởi các tập lệnh và để thực hiện kiểm soát lớn hơn đối với thứ tự thực thi tập lệnh. Trình điều khiển thiết bị phân bổ diện tích bộ nhớ cho mỗi thiết bị mà nó quản lý. Điều này được gọi là khu vực dữ liệu được chia sẻ hoặc khu vực được chia sẻ. Dữ liệu được chia sẻ có thể được lưu trữ trong suốt vòng đời của thiết bị, nghĩa là cho đến khi thiết bị không được quản lý hoặc trình điều khiển thiết bị được khởi động lại hoặc cho một giao dịch. Thông tin hiện đang được lưu giữ trong khu vực dữ liệu được chia sẻ có thể được truy cập bởi bất kỳ tập lệnh CDK nào được áp dụng cho thiết bị đó. Theo mặc định, dữ liệu được lưu trữ trong khu vực được chia sẻ dưới dạng từ điển Python đơn giản nhưng cũng có thể cấu trúc thông tin được chia sẻ bằng các lớp. Nếu bạn muốn sử dụng cấu trúc dựa trên lớp, bạn phải tạo mô-đun Python xác định cấu trúc và chuyển nó cho trình điều khiển thiết bị bằng tùy chọn dòng lệnh. Giải pháp dựa trên lớp cung cấp một cách tiếp cận dễ quản lý hơn để sử dụng khu vực dữ liệu được chia sẻ. Nó cho phép một số thiết lập ban đầu được thực hiện bởi mô -đun Python để khu vực dữ liệu được chia sẻ chứa dữ liệu hữu ích khi tập lệnh CDK đầu tiên được chạy đối với thiết bị. Điều này tương phản với cấu trúc dựa trên từ điển, trong đó từ điển trống khi tập lệnh CDK đầu tiên chạy và bất kỳ dữ liệu, lớp hoặc chức năng nào phải được thêm bởi chính các tập lệnh CDK. Chương này mô tả cách lưu trữ thông tin trong khu vực dữ liệu được chia sẻ bằng cách sử dụng các lớp hoặc từ điển, cung cấp một cách tiếp cận ví dụ cho tổ chức tập lệnh để sử dụng khu vực được chia sẻ và phác thảo một số ứng dụng tiềm năng. Sử dụng các lớp họcLưu trữ dữ liệu trong khu vực dữ liệu được chia sẻ bằng cấu trúc dữ liệu dựa trên lớp cung cấp việc sử dụng khu vực có thể duy trì. Cấu trúc của các lớp sẽ được lưu trữ trong khu vực dữ liệu được chia sẻ phải được định nghĩa là mô -đun Python. Mô -đun là một tệp chứa mã xác định một nhóm các hàm Python hoặc các đối tượng khác. Mô-đun được chạy khi trình điều khiển thiết bị được bắt đầu với tham số dòng lệnh sau: -SharedDataModule module trong đó mô -đun là tên của mô -đun Python xác định cấu trúc của thông tin được lưu giữ trong khu vực dữ liệu được chia sẻ. Ví dụ: \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea … Mô -đun Python phải được cài đặt trên mọi máy đang lưu trữ trình điều khiển thiết bị được sử dụng để định cấu hình các tập lệnh. Note: Khi chỉ định tên của mô -đun Python, bạn không cần bao gồm phần mở rộng tập lệnh. Nếu bạn đang chạy trình điều khiển thiết bị trên Solaris, vị trí của mô -đun Python phải được đặt trong biến môi trường PythonPath. Nếu bạn đang chạy trình điều khiển thiết bị trên Windows, trình điều khiển sẽ tìm mô -đun trong C: \ Program Files \ Oracle Communications \ IP Service Activator \ Program theo mặc định. Biến PythonPath có thể được đặt thành một vị trí thay thế.c:\Program Files\Oracle Communications\IP Service Activator\Program by default. The PYTHONPATH variable may be set to an alternative location. Mô -đun xác định cấu trúc cơ bản của lớp đối tượng được lưu trữ trong khu vực dữ liệu được chia sẻ và các phương thức có sẵn cho các trường hợp của lớp. Mô-đun là một tập lệnh do người dùng xác định và có khả năng thay đổi giữa các cài đặt theo nhu cầu của hoạt động. Tối thiểu, nó sẽ cung cấp các phương pháp để chèn các đối tượng mới vào và loại bỏ các đối tượng khỏi khu vực được chia sẻ. Một mô -đun mẫu được cung cấp trong "tập lệnh mẫu để sử dụng khu vực dữ liệu được chia sẻ". Note: Tên của hàm mà trình điều khiển thiết bị gọi để tạo cấu trúc dựa trên lớp được mã hóa cứng trong trình điều khiển. Các mô-đun do người dùng xác định phải chứa chức năng CreateSharedObject. Ví dụ: def CreateSharedObject(): return SharedInfo() Nếu không có chức năng CreateSharedObject, trình điều khiển sẽ trở lại từ điển. Hình 5-1 minh họa khu vực dữ liệu chia sẻ dựa trên lớp. Sử dụng từ điển PythonNếu tham số dòng lệnh -shareddatamodule không được chuyển cho trình điều khiển thiết bị có liên quan, trình điều khiển sẽ tạo một từ điển trống trong khu vực dữ liệu được chia sẻ khi khởi động. Từ điển Python là một mảng kết hợp, được triển khai bằng cách sử dụng các bảng băm, cung cấp quyền truy cập vào các giá trị của các số nguyên, chuỗi hoặc các đối tượng Python khác được gọi là các phím. Một khóa cho biết nơi có giá trị từ điển A có thể được cho là. Bởi vì chìa khóa vào từ điển có thể là một cái gì đó không phải là một số, các đối tượng từ điển không có bất kỳ thứ tự ngầm nào liên quan đến nhau. Tuy nhiên, một thứ tự rõ ràng có thể được xác định bằng cấu trúc dữ liệu khác, chẳng hạn như danh sách. Các đối tượng được lưu trữ trong một từ điển có thể thuộc bất kỳ loại nào. Sau khi được tạo, các vị trí mới có thể được tạo trong một từ điển vì các giá trị được ghi cho chúng, mà không cần phải tạo vị trí trước. Các giá trị được lưu trữ trong từ điển có thể được truy cập và sử dụng bởi các tập lệnh chạy trên cùng một máy chủ. Hình 5-2 minh họa khu vực dữ liệu chia sẻ dựa trên từ điển. Hình 5-2 khu vực dữ liệu được chia sẻ dựa trên từ điển Lưu trữ và truy xuất dữ liệuTrình điều khiển thiết bị tạo ra hai cửa hàng dữ liệu được chia sẻ cho một thiết bị: một cửa hàng tồn tại suốt đời của thiết bị và một cửa hàng tồn tại suốt đời của giao dịch. Phương pháp sau đây lấy dữ liệu đã được lưu trữ trong khu vực dữ liệu được chia sẻ trong quá trình giao dịch hiện tại: _device.getThisCommitSharedData() Phương pháp sau đây lấy dữ liệu được lưu trữ trong khu vực dữ liệu được chia sẻ trong suốt thời gian của thiết bị: _device.getLifetimeSharedData() Khi một tập lệnh có một tham chiếu đến dữ liệu được chia sẻ, nó có thể đọc và ghi dữ liệu vào khu vực. Kỹ thuật lưu trữ thông tin trong khu vực được chia sẻ phụ thuộc vào việc dữ liệu được lưu trữ dưới dạng lớp hoặc từ điển. Nếu dữ liệu được chia sẻ được lưu trữ dưới dạng đối tượng lớp, có thể gọi các phương thức được xác định cho lớp. Các phương thức này được xác định trong mô -đun Python có tên trong tham số -shareddatamodule trên dòng lệnh của trình điều khiển thiết bị. Ví dụ: giả sử sự tồn tại của phương thức insertBeHavior () cho lớp dữ liệu được chia sẻ: _device.getThisCommitSharedData().insertBehavior(BehaviorX()) chèn một đối tượng của hành vi loại trong khu vực dữ liệu được chia sẻ. Nếu dữ liệu được lưu trữ trong từ điển, có thể truy cập dữ liệu thông qua khóa của nó. Ví dụ: Address=_device.getThisCommitSharedData()["IPAddress"] Một ví dụ về việc sử dụng khu vực dữ liệu được chia sẻCDK cung cấp một giải pháp rất linh hoạt để chia sẻ dữ liệu giữa các tập lệnh, cho phép lưu trữ dữ liệu trên mỗi thiết bị trong thời gian sử dụng của thiết bị hoặc trong thời gian tồn tại của giao dịch, không có hạn chế về loại dữ liệu được lưu trữ hoặc cấu trúc được sử dụng để sử dụng tổ chức nó. Do đó, bất kỳ việc sử dụng khu vực dữ liệu được chia sẻ nào cũng có thể hướng đến các nhu cầu cụ thể của hoạt động. Ví dụ trong phần này minh họa loại xử lý có thể được thực hiện bằng cách sử dụng khu vực dữ liệu được chia sẻ và sử dụng cách tiếp cận dựa trên từ điển để lưu trữ dữ liệu. Điều này có nghĩa là tất cả các lớp và phương thức được xác định trong chính các tập lệnh. Nếu một cách tiếp cận dựa trên lớp được sử dụng, chúng sẽ được xác định trong mô-đun Python được truyền cho trình điều khiển thiết bị trên dòng lệnh. Điều này sẽ đơn giản hóa các tập lệnh dữ liệu, hành vi và bộ điều khiển được áp dụng cho các thiết bị. Một định nghĩa mô -đun python mẫu được cung cấp trong "tập lệnh mẫu để sử dụng khu vực dữ liệu được chia sẻ". Các loại kịch bảnĐể hỗ trợ sử dụng lại chức năng tập lệnh và giảm dự phòng, ví dụ được mô tả trong phần này chia các tập lệnh thành ba loại cơ bản, theo loại chức năng chúng thực hiện:
Note: Việc phân chia các tập lệnh thành hành vi, dữ liệu và tập lệnh điều khiển được thiết kế để tận dụng tối đa các tính năng được cung cấp bởi khu vực dữ liệu được chia sẻ. Sơ đồ được trình bày trong ví dụ này là một phân loại mẫu và chỉ hoạt động như một minh họa. Bạn có thể chọn phân loại các tập lệnh theo bất kỳ sơ đồ logic nào khác. Việc phân chia các tập lệnh thành các loại hành vi, dữ liệu và bộ điều khiển tối ưu hóa việc sử dụng lại chức năng được xác định bởi một tập lệnh. Ví dụ: tập lệnh hành vi có thể được áp dụng cho bất kỳ số lượng thiết bị nào để xác định các khía cạnh chung của cấu hình bản đồ chính sách và được kế thừa cho các giao diện có liên quan. Một số tập lệnh dữ liệu riêng biệt xác định thông tin dành riêng cho giao diện và được áp dụng cho từng giao diện có liên quan. Điều này được minh họa trong Hình 5-3. Hình 5-3 phân chia các tập lệnh thành các loại Về ví dụVí dụ cho thấy cách áp dụng thay đổi cấu hình cho thiết bị, thực hiện thay đổi đơn giản đối với địa chỉ IP giao diện và mô tả. Mặc dù những thay đổi mà nó thực hiện rất đơn giản, nhưng nó minh họa một số nguyên tắc và nhiệm vụ cơ bản mà bạn có thể muốn sử dụng trong các tập lệnh của riêng bạn. Bao gồm các:
Tính năng tập lệnh sau trong ví dụ:
Hầu hết các quá trình xử lý được thực hiện trên cấu hình hiện tại và mới được thực hiện bằng các phương thức được xác định trong tập lệnh hành vi. Tuy nhiên, chúng không thực sự chạy cho đến khi tập lệnh bộ điều khiển gọi phương thức thực thi của hành vi. Máy khách Activator dịch vụ IP Truyền thông Oracle cung cấp một phương thức cơ bản để chỉ định thứ tự trong đó các tập lệnh được áp dụng cho một đối tượng, cho phép bạn chỉ định xem tập lệnh có được chạy trước hay sau khi cấu hình tiêu chuẩn thay đổi do trình điều khiển thiết bị thực hiện hay không. Hình 5-4 hiển thị trang lịch trình trong hộp thoại tập lệnh trình điều khiển nơi bạn có thể chỉ định khi tập lệnh được chạy. Bằng cách chỉ định rằng các tập lệnh dữ liệu và hành vi chạy trước khi cấu hình tiêu chuẩn thay đổi và tập lệnh bộ điều khiển chạy sau các thay đổi, người ta đảm bảo rằng bất kỳ dữ liệu nào mà tập lệnh bộ điều khiển cần xử lý sẽ tồn tại trong khu vực dữ liệu được chia sẻ. Tất cả các tập lệnh hoạt động trên khu vực dữ liệu được chia sẻ dành riêng cho dữ liệu chỉ được giữ cho giao dịch hiện tại:
Các phần sau đây cung cấp một danh sách của mỗi tập lệnh. Các tập lệnh cập nhật khu vực GetThiscommitSharedData hoặc đọc dữ liệu từ khu vực, lưu trữ dữ liệu trong một số từ điển. Đó là:
Kịch bản hành vi cũng tạo ra các từ điển bổ sung bên ngoài khu vực GetThiscommitSharedData. Chúng được sử dụng để xử lý cấu hình giao diện hiện có để nó có thể được so sánh với các lệnh mới tiềm năng được cấu hình cho một giao diện. Những từ điển này là:
Tập lệnh hành vi cũng tạo ra một danh sách các lệnh cần được gửi đến thiết bị trong một khu vực tạm thời trước khi thêm thông tin này vào từ điển lệnh trong khu vực GetthiscommitSharedData.getThisCommitSharedData area. Tập lệnh dữ liệu: setipaddress.pyTập lệnh setipaddress.py xác định địa chỉ IP và mặt nạ dành riêng cho giao diện và sẽ được áp dụng ở cấp độ giao diện thông qua máy khách Activator dịch vụ IP.setIPAddress.py script defines an interface-specific IP address and mask and would be applied at interface level through the IP Service Activator client. Các phần theo sau cung cấp danh sách tập lệnh setipaddress.py và giải thích về cách tập lệnh hoạt động.setIPAddress.py script listing and an explanation of how the script works. Liệt kê setipaddress.py1 #Title: InterfaceIpAddressChanges. Version = '1.0' #IP Service Activator version: 7.0.0 #Date: 1-Aug-2008 9 #begin preamble section # Copy this line and paste it into the context field, editing the # IP address and mask as required ip="0.0.0.0" mask="255.255.255.252" 15 #begin behavior section script_name = "INTERFACE_IPADDRESS" script_driver_type = "cisco" script_type = Interface script_device_role = Any script_interface_role = Any script_apply_when = Before script_repeat = False script_apply_on_restart = True 25 #begin common section # First make sure that there is a section representing interfaces if not _device.getThisCommitSharedData().has_key("interfaces"): _device.getThisCommitSharedData()["interfaces"]={} 30 interfaces = _device.getThisCommitSharedData()["interfaces"] if not interfaces.has_key(_interface.getInterfaceName() ): interfaces[_interface.getInterfaceName()]={} 34 #begin install section # Store the ip address command 36 ipCmd="ip address "+ ip + " " +mask interfaces[_interface.getInterfaceName()]["ip address"]=ipCmd 39 #begin remove section # Mark the ip address key as empty interfaces[_interface.getInterfaceName()]["ip address"]="" Giải thích về setipaddress.pyViệc xử lý tập lệnh bắt đầu bằng cách kiểm tra xem có khóa giao diện trong từ điển GetThiscommitSharedData (dòng 27) hay không. Nếu không có khóa nào tồn tại, tập lệnh tạo ra một và làm cho khóa mới được tạo thành một tham chiếu đến một từ điển mới. Trên các dòng 30-32, tập lệnh lấy nội dung của từ điển giao diện và kiểm tra xem một khóa có tồn tại với tên giao diện có liên quan hay không. Nếu không có khóa nào tồn tại, tập lệnh tạo ra một và làm cho khóa mới được tạo thành một tham chiếu đến một từ điển mới. Địa chỉ IP giao diện và mặt nạ sau đó được lưu trữ tại điểm chính xác trong từ điển giao diện (dòng 34-37).getThisCommitSharedData dictionary (line 27). If no key exists, the script creates one and makes the newly-created key a reference to a new dictionary. On lines 30-32, the script retrieves the content of the interfaces dictionary, and checks whether a key exists with the relevant interface name. If no key exists, the script creates one and makes the newly-created key a reference to a new dictionary. The interface IP address and mask is then stored at the correct point in the interfaces dictionary (lines 34-37). Tập lệnh dữ liệu: setDescrip.pyTập lệnh SetDescrip.py thực hiện xử lý giống hệt với bản được thực hiện bởi setipaddress.py ngoại trừ mô tả giao diện thay thế địa chỉ IP.setDescription.py script performs processing identical to that performed by setIpAddress.py except that an interface description replaces the IP address. Phần sau đó cung cấp danh sách tập lệnh SetDescrip.py.setDescription.py script listing.
Liệt kê setDescrip.py1 #Title: InterfaceDescriptionChanges Version = '1.0' #IP Service Activator version: 7.0.0 #Date: 31-Mar-2008 9 #begin preamble section description= "PE interface for customer XXX" 12 #begin behavior section script_name = "INTERFACE_DESCRIPTION" script_driver_type = "cisco" script_type = Interface script_device_role = Any script_interface_role = Any script_apply_when = Before script_repeat = False script_apply_on_restart = True 22 #begin common section # first make sure that there is a section representing interfaces if not _device.getThisCommitSharedData().has_key("interfaces"): _device.getThisCommitSharedData()["interfaces"]={} interfaces=_device.getThisCommitSharedData()["interfaces"] if not interfaces.has_key(_interface.getInterfaceName() ): interfaces[_interface.getInterfaceName()]={} 31 #begin install section # Set the description of the interface data descCmd="description "+ description interfaces[_interface.getInterfaceName()]["description"]=descCmd 36 #begin remove section # Mark the description key as empty interfaces[_interface.getInterfaceName()]["description"]="" Tập lệnh hành vi: ProcessInterfaces.pyCác phần theo sau cung cấp danh sách tập lệnh ProcessInterfaces.py và giải thích về cách tập lệnh hoạt động.processInterfaces.py script listing and an explanation of how the script works. Liệt kê các processInterfaces.py1 #Title: InterfaceDescriptionChanges Version = '1.0' #IP Service Activator version: 7.0.0 #Date: 31-Mar-2008 9 #begin preamble section #N/A 12 #begin behavior section script_name = "PROCESS_INTERFACES" script_driver_type = "cisco" script_type = Interface script_device_role = Any script_interface_role = Any script_apply_when = Before script_repeat = False script_apply_on_restart = True 22 #begin common section #Load the string module 24 import string class InterfaceProcessor: 26 def __init__( self ): 27 self.types=("description", "ip address" ) 28 def getDeviceConfig(self, command ): if not _device.getThisCommitSharedData().has_key("config"): _device.getThisCommitSharedData()["config"]={} 34 # Log onto the device, send the command and stash the returned # config split into lines. if not _device.getThisCommitSharedData()["config"].has_key(command): _device.openSession() config = _device.deliverCommand(command ) _device.closeSession() _device.getThisCommitSharedData()["config"][command]=string.split(config,"\n") 40 # Return the content of the [config][command] key return _device.getThisCommitSharedData()["config"][command] 43 # Get configuration from the device def getInterfaceConfig( self ): config=self.getDeviceConfig("show running config") 47 allinterfaces={} interfaceconfig=None 49 for ind in range( 0 , len(config) ): str=string.lstrip( config[ind] ) if ( str.startswith ("interface") ): 53 interfaceconfig={} allinterfaces[str]=interfaceconfig else: if( interfaceconfig ): 57 if( str == "!"): interfaceconfig=None else: 60 for type in self.types: 61 if ( str.startswith( type ) ): 62 interfaceconfig[type]=str # else not in an interface and do need to look at the line. return allinterfaces 66 def Execute(self): 68 # Check for the commands dictionary if not _device.getThisCommitSharedData().has_key("commands"): _device.getThisCommitSharedData()["commands"]={} 71 # Check that priority 3 commands exist if not _device.getThisCommitSharedData() ["commands"].has_key(3): _device.getThisCommitSharedData()["commands"][3]=[] 76 # Check whether there is any required interface configuration if not _device.getThisCommitSharedData().has_key("interfaces"): return 80 # Retrieve the current configuration from the device allOldData=self.getInterfaceConfig() 83 # Loop through the interfaces with required data for (name, reqData) in _device.getThisCommitSharedData()["interfaces"].items(): commands=[] 87 # Get the existing interface config or create an empty object if( allOldData.has_key(name) ): oldData=allOldData[name] else: oldData={} 92 # Process each type of config the script can handle in turn if reqData.has_key(type): 94 if( reqData[type] ): if( not oldData.has_key(type) or oldData[type] != reqData[type] ): commands.append( reqData[type] ) else: if( oldData.has_key(type) ): commands.append( "no " + oldData[type ] ) 102 # If there are any interface commands, surround them by enter # and exit commands and add them to the list of commands to execute if( len( commands )): _device.getThisCommitSharedData()["commands"][3].append ("interface " + name) _device.getThisCommitSharedData()["commands"][3]=\ _device.getThisCommitSharedData()["commands"][3] + commands 111 _device.getThisCommitSharedData()["commands"][3]. append("exit") 113 #begin install section if not _device.getThisCommitSharedData().has_key("behavior"): _device.getThisCommitSharedData()["behavior"]={} if not _device.getThisCommitSharedData()["behavior"].has_key(100): _device.getThisCommitSharedData()["behavior"][100]=[] _device.getThisCommitSharedData()["behavior"][100].append(InterfaceProcessor()) #begin remove section Giải thích về ProcessInterfaces.pyPhần chung (dòng 22) xác định lớp giao diện có thể thực hiện các tác vụ sau:InterfaceProcessor class that can perform the following tasks:
Lớp học có thể được chia thành hai phần. Phần đầu tiên xác định các phương thức phân tích cú pháp, so sánh và lưu trữ cấu hình, phần thứ hai xác định một phương thức thực thi gọi các phương thức này. Khi tập lệnh được chạy, một đối tượng hành vi được tạo trong khu vực dữ liệu được chia sẻ, bằng cách gọi đến lớp giao diện. Phương thức thực thi được gọi và quá trình xử lý tập lệnh chỉ được thực hiện khi tập lệnh bộ điều khiển gọi phương thức.InterfaceProcessor class. The Execute method is called and the script's processing is performed only when the controller script calls the method. Mô -đun chuỗi được nhập (dòng 24) cung cấp chức năng theo yêu cầu của quy trình phân tích cú pháp. Phương thức trình xây dựng __init__ (dòng 26) được chạy tự động khi tên lớp được gọi để tạo một thể hiện. Phương pháp có thể được sử dụng để thực hiện tất cả các thiết lập cần thiết cho lớp.__init__ constructor method (line 26) is run automatically when the class name is called to create an instance. The method can be used to perform all the set up required for the class. Dòng 27 tạo ra một danh sách các chuỗi, trong đó mỗi chuỗi xác định sự bắt đầu của một dòng cấu hình mà tập lệnh được thiết kế để xử lý. Danh sách các chuỗi này được gán cho các loại biến lớp. Biến này được sử dụng sau đó trong tập lệnh (dòng 93) và cung cấp một phương pháp quản lý dữ liệu có thể duy trì hơn để được xử lý bởi tập lệnh. Nếu tập lệnh cần được cập nhật để xử lý cấu hình bổ sung trong tương lai, một chuỗi mới có thể được thêm vào biến. Phương thức GetDeviceConfig (dòng 28) hiện được gọi với lệnh Hiển thị Chạy cấu hình. Tuy nhiên, phương thức hỗ trợ bất kỳ lệnh cấu hình nào khác và cung cấp loại chức năng mà bạn có thể muốn xác định trong mô-đun Python khi sử dụng cách tiếp cận dựa trên lớp đối với khu vực dữ liệu được chia sẻ. Phương pháp kiểm tra xem từ điển GetThiscommitSharedData đã có một bản sao của cấu hình đang chạy (được lưu trữ trong từ điển cấu hình). Nếu không, nó đăng nhập vào thiết bị, truy xuất cấu hình, chia nó thành các dòng và lưu trữ nó trong từ điển cấu hình.getDeviceConfig method (line 28) is currently called with the show running config command. The method supports any other configuration command, however, and provides the type of functionality that you may wish to define in a Python module when using a class-based approach to the shared data area. The method checks whether the getThisCommitSharedData dictionary already has a copy of the running configuration (stored in the config dictionary). If not, it logs into the device, retrieves the config, splits it into lines and stores it in the config dictionary. Phương thức GetInterfaceConfig gọi getDeviceConfig với lệnh hiển thị cấu hình chạy. Sau đó, nó tạo ra một từ điển AllInterfaces (dòng 47) và biến InterfaceConfig và đặt biến thành NOWN. Sau đó, nó chu trình qua từng dòng cấu hình được giữ trong từ điển cấu hình và kiểm tra cấu hình giao diện (dòng 49-50). Khi tìm thấy cấu hình giao diện, phương thức tạo từ điển InterfaceConfig (dòng 53) và thêm một khóa được dán nhãn theo tên của giao diện vào từ điển AllInterfaces trỏ đến từ điển InterfaceConfig. Đối với mỗi chuỗi được gán cho các loại biến lớp (nghĩa là địa chỉ IP và mô tả), phương thức kiểm tra xem dòng cấu hình hiện đang được xử lý bắt đầu với chuỗi (dòng 61). Nếu vậy, nó tạo một khóa trong từ điển InterfaceConfig, lấy giá trị hiện tại của loại làm tên khóa và ghi dòng cấu hình hiện tại vào khóa (dòng 62). Khi đạt được kết thúc cấu hình giao diện (được biểu thị bằng ký tự \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …4) (dòng 57), phương thức sẽ xóa biến InterfaceConfig để đánh dấu rằng trình phân tích cú pháp nằm ngoài cấu hình giao diện. Cuối cùng, phương thức trả về nội dung của từ điển giao diện (dòng 64).getInterfaceConfig method calls getDeviceConfig with the show running config command. It then creates an allinterfaces dictionary (line 47) and an interfaceconfig variable and sets the variable to None. It then cycles through each line of configuration held in the config dictionary and checks for interface configuration (lines 49-50). Where interface configuration is found, the method creates an interfaceconfig dictionary (line 53) and adds a key labelled according to the name of the interface to the allinterfaces dictionary that points to the interfaceconfig dictionary. For each of the strings assigned to the class variable types (i.e. ip address and description), the method checks whether the line of config currently being processed starts with the string (line 61). If so, it creates a key in the interfaceconfig dictionary, taking the current value of type as the key name, and writes the current line of configuration to the key (line 62). When the end of interface configuration is reached (indicated by a \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …4 character) (line 57), the method clears the interfaceconfig variable to mark that the parser is outside of interface configuration. Finally, the method returns the content of the interfaces dictionary (line 64). Phương thức thực thi được gọi bởi tập lệnh bộ điều khiển khi nó chạy. Nó kiểm tra xem các lệnh từ điển có tồn tại trong từ điển GetthiscommitSharedData hay không và nếu không, tạo ra một (dòng 69-70). Sau đó, nó kiểm tra xem khóa 3 có tồn tại trong từ điển lệnh hay không; Đây là ưu tiên được gán cho các lệnh được tạo bởi hành vi cụ thể này. Có thể có các khóa cho các lệnh được tạo bởi các hành vi khác trong từ điển lệnh. Nếu khóa không tồn tại, phương thức sẽ tạo nó (dòng 72-74).Execute method is called by the controller script when it runs. It checks whether the commands dictionary exists within the getThisCommitSharedData dictionary and, if not, creates one (lines 69-70). It then checks that key 3 exists in the commands dictionary; this is the priority assigned to the commands generated by this particular behavior. There may be keys for commands generated by other behaviors in the commands dictionary. If the key does not exist, the method creates it (lines 72-74). Trước khi thực hiện bất kỳ xử lý tiếp theo nào, phương thức kiểm tra xem có cấu hình giao diện nào đang chờ được gửi đến thiết bị không (dòng 77-79). Phương pháp kiểm tra xem một từ điển giao diện có tồn tại trong từ điển GetThiscommitSharedData hay không. Đây là từ điển được tạo hoặc cập nhật bởi bất kỳ tập lệnh dữ liệu nào đã chạy đối với thiết bị. Nếu từ điển không tồn tại, không có gì để làm và phương thức trả về.getThisCommitSharedData dictionary. This is the dictionary created or updated by any data scripts that have run against the device. If the dictionary does not exist, there is nothing to do and the method returns. Phương thức sau đó truy xuất cấu hình hiện tại từ thiết bị bằng cách gọi phương thức GetInterfaceConfig (dòng 81). Sự trở lại của GetInterfaceConfig là từ điển giao diện, vì vậy biến alloldData là một con trỏ đến từ điển.getInterfaceConfig method (line 81). The return of getInterfaceConfig is the interfaces dictionary, so the allOldData variable is a pointer to a dictionary. Phương thức sau đó lặp qua các giao diện mà cấu hình đã được lưu trữ trong từ điển giao diện (dòng 83-86), truy xuất tên, cặp giá trị của nó (mỗi cặp bao gồm một tên giao diện và cấu hình được đặt vào thiết bị). Phương thức lần lượt xử lý từng cặp, tạo một vùng cho các lệnh của giao diện hiện tại. Nếu cấu hình được truy xuất (được giữ trong từ điển giao diện) có một khóa có tên khớp với hiện đang được xử lý, phương thức gán nội dung của khóa (nghĩa là tên giao diện trỏ đến cấu hình giao diện hiện tại) cho biến OldData. Nếu không, phương thức tạo ra một từ điển trống (dòng 87-91).oldData. If not, the method creates an empty dictionary (lines 87-91). Sau đó, mỗi loại cấu hình, tập lệnh có thể xử lý lần lượt được xử lý và phương thức kiểm tra xem có lệnh được lưu trữ cho giao diện không (dòng 93). Nếu lệnh được phân phối không phải là một chuỗi trống và nếu lệnh chưa được cấu hình trên thiết bị (dòng 94) hoặc được cấu hình và không giống với lệnh hiện được lưu trữ cho giao diện (dòng 96), Phương thức thêm lệnh vào danh sách lệnh cho giao diện (97). Nếu lệnh được gửi là một chuỗi trống (nghĩa là, lệnh được định cấu hình không còn được yêu cầu nữa) và lệnh đã được cấu hình trên thiết bị, phương thức sẽ thêm & rsquor; không có 'dạng lệnh của lệnh vào danh sách lệnh cho Giao diện (dòng 100). Nếu có bất kỳ lệnh nào trong danh sách lệnh, hãy bao quanh chúng bằng các lệnh enter và thoát và thêm chúng vào từ điển của từ điển getthiscommitshareddata từ khóa ưu tiên 3 (dòng 102-111). Các lệnh từ điển lưu trữ các lệnh để thực thi và thứ tự thực thi của chúng.getThisCommitSharedData dictionary's commands dictionary at the priority 3 key (lines 102-111). The commands dictionary stores the commands to execute and their order of execution. Phần cài đặt (dòng 113) là phần duy nhất của tập lệnh sẽ được thực thi khi tập lệnh được chạy đối với thiết bị. Nó viết một đối tượng hành vi cho từ điển GetThiscommitSharedData bằng cách gọi phương thức giao diện (dòng 119). Các đối tượng hành vi được lưu trữ theo ưu tiên của chúng trong một từ điển hành vi.getThisCommitSharedData dictionary by calling the InterfaceProcessor method (line 119). Behavior objects are stored according to their priority within a behavior dictionary. Tập lệnh điều khiển: hành viandCommandControll.pyCác phần theo sau cung cấp danh sách tập lệnh hành viandCommandControll.py và giải thích về cách tập lệnh hoạt động.BehaviorAndCommandController.py script listing and an explanation of how the script works. Liệt kê hành viandcommandcontroll.py\Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …0 Giải thích về hành viandCommandControll.pyKịch bản trước tiên kiểm tra từ điển hành vi trong Từ điển GetThiscommitSharedData (dòng 25). Nếu từ điển tồn tại, tập lệnh lấy các khóa của nó (mỗi tập lệnh hành vi đã viết một khóa cho từ điển hành vi để chỉ ra mức độ ưu tiên mà nó nên được thực thi), lần lượt sắp xếp các khóa/ưu tiên và gọi cho mỗi phương thức thực thi của đối tượng hành vi (các dòng lần lượt (các dòng 26-31).getThisCommitSharedData dictionary (line 25). If the dictionary exists, the script retrieves its keys (each behavior script has written a key to the behavior dictionary to indicate the priority in which it should be executed), sorts the keys/priorities and calls each behavior object's Execute method in turn (lines 26-31). Sau khi xử lý đối tượng hành vi, tập lệnh kiểm tra xem điều này có dẫn đến các lệnh được ghi vào từ điển của từ điển GetThiscommitSharedData. Tập lệnh sắp xếp các lệnh được lưu trữ theo khóa, các vòng lặp qua tất cả các lệnh được lưu trữ và gửi chúng đến thiết bị (dòng 37-42).getThisCommitSharedData dictionary's commands dictionary. The script sorts the stored commands by key, loops through all of the stored commands and sends them to the device (lines 37-42). Báo cáo lỗi trong tập lệnh hành viNếu bạn tuân theo các hướng dẫn được nêu để sử dụng khu vực dữ liệu được chia sẻ, chức năng của tập lệnh hành vi không được thực thi cho đến khi nó được gọi bởi tập lệnh bộ điều khiển. Điều này có nghĩa là biến _Result cho thấy sự thành công hoặc thất bại của tập lệnh hiện đang chạy không thể được sử dụng để báo cáo về tập lệnh hành vi. Điều này là do tập lệnh hiện đang chạy khi chức năng của tập lệnh hành vi được thực thi là tập lệnh bộ điều khiển._result variable that indicates the success or failure of the script that is currently running cannot be used to report on the Behavior script. This is because the script that is currently running when the Behavior script's functionality is executed is the Controller script. Để báo cáo về các lỗi xảy ra khi đối tượng hành vi được thực thi, ID của tập lệnh hành vi và thông tin thất bại phải được lưu trữ trong đối tượng hành vi được tạo bởi tập lệnh. Những chi tiết này sau đó có thể được truy xuất bởi tập lệnh bộ điều khiển khi nó chạy. Phương thức cấu trúc lớp của tập lệnh hành vi sẽ xác định các biến để giữ các giá trị của các biến _ID và _failure_code, như sau:_id and _failure_code variables, as follows: \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …1 Phương thức thực thi của tập lệnh kiểm tra điều kiện thất bại và nếu xảy ra lỗi, hãy trả về các giá trị biến và thông báo về lỗi, như sau:Execute method checks for a failure condition and, if a failure occurred, returns the variable values and a message about the failure, as follows: \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …2 Tập lệnh bộ điều khiển sử dụng phương thức SendScriptObjectFailure của biến _Result để truy xuất các chi tiết thất bại của tập lệnh hành vi, như sau:_result variable's sendScriptObjectFailure method to retrieve the behavior script's failure details, as follows: \Program\cisco_device_driver.exe|"-SharedDataModule CreateSharedArea …3 Các chi tiết này được gửi đến máy chủ chính sách và thông báo được hiển thị trong ngăn lỗi hiện tại trong giao diện người dùng. Làm thế nào để bạn liên kết hai tệp python với nhau?Sau đây là các bước để hợp nhất ... Mở tệp1.TXT và FILE2.txt trong chế độ đọc .. Mở File3.TXT trong chế độ ghi .. Đọc dữ liệu từ File1 và thêm nó vào một chuỗi .. Đọc dữ liệu từ File2 và nối dữ liệu của tệp này đến chuỗi trước .. Viết dữ liệu từ chuỗi đến File3 .. Đóng tất cả các tệp .. Làm cách nào để chia sẻ kịch bản Python?Làm cách nào để chia sẻ mã của tôi trực tuyến?.. Sử dụng nút "Chia sẻ" trong trình chỉnh sửa.Trình chỉnh sửa Pythonanywhere (từ tab Tệp) cung cấp cho bạn tùy chọn chia sẻ tệp - tìm biểu tượng PaperClip ở đầu trình soạn thảo..... Sử dụng bảng điều khiển chính..... Bằng cách xây dựng một ứng dụng web..... Tái bút - Hoặc bạn có thể đi nơi khác .. Một kịch bản Python có thể gọi một kịch bản khác không?Sử dụng phương thức ExecFile () để chạy tập lệnh Python trong một tập lệnh Python khác.Hàm execFile () thực thi tệp mong muốn trong trình thông dịch.Hàm này chỉ hoạt động trong Python 2. Trong Python 3, hàm ExecFile () đã bị xóa, nhưng điều tương tự có thể đạt được trong Python 3 bằng phương thức EXEC ().. The execfile() function executes the desired file in the interpreter. This function only works in Python 2. In Python 3, the execfile() function was removed, but the same thing can be achieved in Python 3 using the exec() method. |