- MeasurementLink™ Support for Python
MeasurementLink Support for Python (ni-measurementlink-service) is a Python
framework that helps you create reusable measurement plug-ins using gRPC
services. Deploy your measurement plug-ins to perform interactive validation in
InstrumentStudio and automated testing in TestStand.
- Python >= 3.8 (3.9 recommended)
- grpcio >= 1.49.1, < 2.x
- protobuf >= 4.21, < 5.x
- pywin32 >= 303 (Only for Windows)
By default, Windows has a path length limit of 260 characters. NI recommends enabling support for long paths when developing and deploying Python measurement services.
There are three ways to do this:
- When installing Python using the Python for Windows installer, click
Disable path length limitat the end of the installation. - Set the
Enable Win32 long pathsgroup policy:- Run
gpedit.msc. - Expand
Computer Configuration»Administrative Templates»All Settings. - Find
Enable Win32 long pathsin the list, double-click it, and set it toEnabled.
- Run
- In the Windows registry, set
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled(type:REG_DWORD) to 1. For more details, see Maximum Path Length Limitation.
The examples directory contains example measurements for MeasurementLink 2023 Q3 or later. If
you are using a previous version of MeasurementLink, download the appropriate examples:
- MeasurementLink 2023 Q1: measurementlink-python-examples-1.0.1.zip
- MeasurementLink 2023 Q2: measurementlink-python-examples-1.0.1.zip
- MeasurementLink 2023 Q3: measurementlink-python-examples-1.1.0.zip
For more information on setting up and running the example measurements, see the included README.md file.
For best results, use the example measurements corresponding to the version of MeasurementLink that you are using. Newer examples may demonstrate features that are not available in older versions of MeasurementLink.
This section provides instructions to develop custom measurement services in Python using MeasurementLink Support for Python.
Make sure the system has the recommended Python version is installed. Install MeasurementLink Support for Python using pip.
REM Activate the required virtual environment if any.
pip install ni-measurementlink-serviceCheck if you have installed the expected version of MeasurementLink Support for Python installed by running the below command:
pip show ni-measurementlink-service- Install the
ni-measurementlink-generatorpackage.
REM Activate the required virtual environment if any.
pip install ni-measurementlink-generator-
Run the
ni-measurementlink-generatortool. Use command line arguments to specify thedisplay-nameand optionally theversion,measurement-type, andproduct-type.- Running
ni-measurementlink-generatorwithout optional arguments:
ni-measurementlink-generator SampleMeasurement'SampleMeasurement' is the display name of your measurement service. Without the optional arguments, the other arguments are generated for you based on the display name.
- Running
ni-measurementlink-generatorwith optional arguments formeasurement-version,ui-file,service-class, anddescription-url:
ni-measurementlink-generator SampleMeasurement --measurement-version 0.1.0.0 --ui-file MeasurementUI.measui --service-class SampleMeasurement_Python --description-url https://www.example.com/SampleMeasurement.html- Running
ni-measurementlink-generatorwith optional argument fordirectory-out
ni-measurementlink-generator SampleMeasurement --directory-out <new_path_for_created_files>If no output directory is specified, the files will be placed in a new folder under the current directory named after the display name without spaces.
- Running
-
To customize the created measurement, provide metadata of the measurement's configuration (input parameters) and outputs (output parameters) in
measurement.py.-
Use the
configuration()decorator to provide metadata about the configurations.The order of the configuration decorator must match with the order of the parameters defined in the function signature.@foo_measurement_service.register_measurement #Display Names can not contains backslash or front slash. @foo_measurement_service.configuration("DisplayNameForInput1", DataType.String, "DefaultValueForInput1") @foo_measurement_service.configuration("DisplayNameForInput2", DataType.String, "DefaultValueForInput2") def measure(input_1, input_2): ''' A simple Measurement method''' return ["foo", "bar"]
-
Use the
output()decorator to provide metadata about the output.The order of the output decorators from top to bottom must match the order of the values of the list returned by the function.@foo_measurement_service.register_measurement @foo_measurement_service.configuration("DisplayNameForInput1", nims.DataType.String, "DefaultValueForInput1") @foo_measurement_service.configuration("DisplayNameForInput2", nims.DataType.String, "DefaultValueForInput2") @foo_measurement_service.output("DisplayNameForOutput1", nims.DataType.String) @foo_measurement_service.output("DisplayNameForOutput2", nims.DataType.String) def measure(input_1, input_2): return ["foo", "bar"]
-
-
Run/Debug the created measurement by following the steps discussed in the section "Steps to run/debug the measurement service".
-
Start the discovery service if not already started.
-
(Optional) Activate related virtual environments. Measurement developers can skip this step if they are not using any virtual environments or poetry-based projects.
.venv\scripts\activate
-
After successful activation, you can see the name of the environment,
(.venv)is added to the command prompt. -
If you face an access issue when trying to activate, retry after allowing scripts to run as Administrator by executing the below command in Windows PowerShell:
Set-ExecutionPolicy RemoteSigned
-
-
To stop the running measurement service, press
Enterin the terminal to properly close the service. -
(Optional) After the usage of measurement, deactivate the virtual environment. Measurement developers can skip this step if they are not using any virtual environments or poetry-based projects.
deactivate
The MeasurementLink discovery service provides a registry of other services, and can discover and activate other services on the system. These features allow the discovery service to distinguish, manage, and describe measurement services on the system.
To statically register a measurement service with the MeasurementLink discovery service, do the following:
-
Create a startup batch file or executable for the measurement service.
-
Edit the measurement service's
.serviceconfigfile and set thepathvalue to the filename of the startup batch file or executable. -
Copy the measurement service's directory (including the
.serviceconfigfile and startup batch file) to a subdirectory ofC:\ProgramData\National Instruments\MeasurementLink\Services.
Note If you are using a virtual environment, do not copy the
.venvsubdirectory—the virtual environment must be re-created in the new location.
Once your measurement service is statically registered, the MeasurementLink discovery service makes it visible in supported NI applications.
The batch file used for static registration is responsible for starting the Python Scripts.
Typical Batch File:
"<path_to_python_exe>" "<path_to_measurement_file>"Examples to start the fictitious file named foo_measurement.py:
-
Using the Python system distribution
python foo_measurement.py
-
Using the virtual environment
REM Windows .\.venv\Scripts\python.exe foo_measurement.py REM Linux .venv/bin/python foo_measurement.py
To create an executable from a measurement, you can use the pyinstaller tooling. If you are using a Poetry project, add pyinstaller to its dev-dependencies. When statically registering the service, install the EXE into a unique directory along with its .serviceconfig and UI files.
Typical PyInstaller command to build executable:
pyinstaller --onefile --console --paths .venv\Lib\site-packages measurement.py"File not found" or "No such file or directory" errors when copying or running a measurement service
If copying or running a measurement service produces "File not found" or "No such file or directory" errors, make sure to enable Win32 long paths. If you are unable to enable Win32 long paths, consider deploying the measurement service to a directory with a shorter path.
Measurement and its related files can be maintained as a Python package. The basic components of any Python measurement package are:
-
Measurement Python module (
.pyfile)- This file contains all the details related to the measurement and also contains the logic for the measurement execution.
- This file is run to start the measurement as a service.
-
UI File
- UI file for the measurement. Types of supported UI files are:
- Measurement UI (
.measui): created using the MeasurementLink UI Editor application. - LabVIEW UI (
.vi)
- Measurement UI (
- The path of this file is configured by
ui_file_pathinmeasurement_infovariable definition in measurement Python module (.py).
- UI file for the measurement. Types of supported UI files are:
Python communities have different ways of managing Python packages and their dependencies. It is up to the measurement developer to decide how to maintain the package and dependencies. Measurement developers can choose from a few common approaches discussed below based on their requirements.
-
Install
poetry(one-time setup)-
Make sure the system has the recommended Python version installed.
-
Install
poetryusing the installation steps given in https://python-poetry.org/docs/#installation.
-
-
Create a new Python project and add
ni-measurementlink-serviceas a dependency to the project.-
Open a command prompt, and change the working directory to the directory of your choice where you want to create the project.
cd <path_of_directory_of_your_choice>
-
Create a Python package (project) using the
poetry newcommand. Poetry will create boilerplate files and folders that are commonly needed for a Python project.poetry new <name_of_the_project>
-
Add the
ni-measurementlink-servicepackage as a dependency using thepoetry addcommand.cd <name_of_the_project> poetry add ni-measurementlink-service
-
The virtual environment will be auto-created by poetry.
-
Create measurement modules as described in "Developing a minimal Python measurement"
-
Any additional dependencies required by measurement can be added using add command.
poetry add <dependency_package_name>
-
-
For detailed info on managing projects using poetry refer to the official documentation.
-
Make sure the system has the recommended Python version installed.
-
Open a command prompt, and change the working directory to the directory of your choice where you want to create a project.
cd <path_of_directory_of_your_choice>
-
Create a virtual environment.
REM This creates a virtual environment named .venv python -m venv .venv -
Activate the virtual environment. After successful activation
.venv\scripts\activate REM Optionally upgrade the pip within the venv by executing the command python -m pip install -U pip -
Install the
ni-measurementlink-servicepackage into the virtual environment.pip install ni-measurementlink-service
-
Create measurement modules as described in "Developing a minimal Python measurement"
-
Any additional dependencies required by measurement can be added pip install.
pip install <dependency_package_name>
-
For detailed info on managing projects with a virtual environment, refer to the official documentation.
Create and Manage Python Measurement Package by directly installing ni-measurementlink-service as a system-level package
Measurement developers can also install ni-measurementlink-service as a system package if necessary.
-
Install the
ni-measurementlink-servicepackage from the command promptpip install ni-measurementlink-service
-
Create measurement modules as described in "Developing a minimal Python measurement"