Package: ni-measurement-service
MeasurementLink™ Support for PythonMeasurementLink™ Support for PythonIntroductionAbbreviationsDependenciesExamplesSetting up the Example MeasurementsExecuting the Example MeasurementsDeveloping Measurements: Quick StartInstallationDeveloping a minimal python measurementSteps to run/debug the measurement serviceStatic Registration of Python MeasurementsCreate a batch file that runs a python measurementCreate Executable for Python ScriptsAPI ReferencesAppendix: Managing Measurement as Python Package(Project)Create and Manage Python Measurement Package using poetryCreate and Manage Python Measurement Package using venvCreate and Manage Python Measurement Package by directly installingni-measurement-serviceas a system-level packageIntroductionMeasurementLink Support for Python (ni-measurement-service) is a python framework that enables measurement developers to quickly create python measurements and run them as a service (gRPC).DependenciesPython >= 3.8(3.9 recommended)grpcio >= 1.41.1, < 2.xprotobuf >= 3.20, < 4.xpywin32 >= 303 (Only for Windows)ExamplesTheexamplesdirectory contains the following example projects:sample_measurement: Performs a loopback measurement with various data types.nidaqmx_analog_input: Performs a finite analog input measurement with NI-DAQmx.nidcpower_source_dc_voltage: Sources and measures a DC voltage with an NI SMU. Provides a Measurement UInidcpower_source_dc_voltage_with_labview_ui: Sources and measures a DC voltage with an NI SMU. Provides a LabVIEW UInidmm_measurement: Performs a measurement using an NI DMM.nifgen_standard_function: Generates a standard function waveform using an NI waveform generator.niscope_acquire_waveform: Acquires a waveform using an NI oscilloscope.niswitch_control_relays: Controls relays using an NI relay driver (e.g. PXI-2567).Setting up the Example MeasurementsThe example measurements shared arepoetry-basedprojects. Follow the below steps to  for setting up the example measurement:Installpoetry. Refer tohttps://python-poetry.org/docs/#installationfor information on installing poetry.Open a command prompt, and change the working directory to the directory of the example measurement you want to work with.cd <path_of_example_measurement>
REM Example: cd "..\measurement-services-python\examples\dc_measurement"Runpoetry install. This command creates/updates the .venv and installs all the dependencies(includingni-measurement-servicepackage) needed for the Example into.venvpoetry installIf you get a "command not found" error duringpoetry install, make sure that you added the Poetry path to the system path. Refer tohttps://python-poetry.org/docs/#installing-with-the-official-installer/Add-poetry-to-your-pathExecuting the Example MeasurementsStart the discovery service if not already started.Usepoetry runto run the measurement service:poetry run python measurement.pyDeveloping Measurements: Quick StartThis section provides instructions to develop custom measurement services in Python using MeasurementLink Support for Python.InstallationMake sure the system has the recommended python version is installed. Install MeasurementLink Support for Python usingpip.REM Activate the required virtual environment if any.
pip install ni-measurement-serviceCheck if you have installed the expected version of MeasurementLink Support for Python installed by running the below command:pip show ni-measurement-serviceDeveloping a minimal python measurementInstall theni-measurement-generatorpackage.REM Activate the required virtual environment if any.
pip install ni-measurement-generatorRun theni-measurement-generatortool. Use command line arguments to specify thedisplay-nameand optionally theversion,measurement-type, andproduct-type.Runningni-measurement-generatorwithout optional arguments:ni-measurement-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.Runningni-measurement-generatorwith optional arguments formeasurement-version,ui-file,service-class, anddescription-url:ni-measurement-generator SampleMeasurement --measurement-version 0.1.0.0 --ui-file MeasurementUI.measui --service-class SampleMeasurement_Python --description-url https://www.example.com/SampleMeasurement.htmlRunningni-measurement-generatorwith optional argument fordirectory-outni-measurement-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.To customize the created measurement, provide metadata of the measurement's configuration(input parameters) and outputs(output parameters) inmeasurement.py.Use theconfiguration()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")defmeasure(input_1,input_2):''' A simple Measurement method'''return["foo","bar"]Use theoutput()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)defmeasure(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".Steps to run/debug the measurement serviceStart the discovery service if not already started.(Optional)Activate related virtual environments. Measurement developers can skip this step if they are not using anyvirtual environmentsorpoetry-based projects..venv\scripts\activateAfter 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 RemoteSignedRun/Debugthe measurement python file.To stop the running measurement service, pressEnterin 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 anyvirtual environmentsorpoetry-based projects.deactivateStatic Registration of Python MeasurementsRefer to theStatic Registration of measurements sectionfor the detailed steps needed to statically register a measurement.To Statically register the examples provided, the user can copy the example directory with the service config file with the startup batch file, to the search paths and follow theSetting up the Example Measurementssection to set up the measurements.Note: The startup batch file can be modified accordingly if the user wants to run with a custom python distribution or virtual environmentCreate a batch file that runs a python measurementThe 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 namedfoo_measurement.py:Using the Python system distributionpython foo_measurement.pyUsing the virtual environmentREM Windows
.\.venv\Scripts\python.exe foo_measurement.py

REM Linux 
.venv/bin/python foo_measurement.pyCreate Executable for Python ScriptsTo create an executable from a measurement, measurement authors can use thepyinstallertooling. During the executable creation, the user can also embed the User Interface file using the--add-data "<path_of_the_UI_File>;.".Typical Pyinstaller command to build executable.pyinstaller --onefile --console --add-data "<path_of_the_UI_File>;." --paths .venv\Lib\site-packages\ <path_of_the_measurement_script>API ReferencesClick hereto view the API reference documentation.Appendix: Managing Measurement as Python Package(Project)Measurement and its related files can be maintained as a python package. The basic components of any Python Measurement Package are:Measurement Python Module(.py file)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 FileUI file for the Measurement. Types of supported UI files are:Measurement UI(.measui): created using theMeasurement UI Editor application.LabVIEW UI(.vi)The path of this file is configured byui_file_pathinmeasurement_infovariable definition in Measurement Python Module(.py file).Python communities have different ways of managing a python package and its dependencies. It is up to the measurement developer, on how they wanted to maintain the package and dependencies. Measurement developers can choose from a few common approaches discussed below based on their requirements.Note: Once we have the template support for Python measurement, the approach to managing the python measurement package(project) will be streamlined and simplified.Create and Manage Python Measurement Package using poetrySetting up Poetry(One-time setup)Make sure the system has the recommended python version installed.Install thepoetryusing the installation steps given inhttps://python-poetry.org/docs/#installation.Create a new python project and addni-measurement-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 new command. Poetry will create boilerplate files and folders that are commonly needed for a python project.poetry new <name_of_the_project>Add theni-measurement-servicepackage as a dependency using thepoetry add command.cd <name_of_the_project>
poetry add ni-measurement-serviceThe 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 usingadd command.poetry add <dependency_package_name>For detailed info on managing projects using poetryrefer to the official documentation.Create and Manage Python Measurement Package using venvMake 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 .venvActivate 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 pipInstall theni-measurement-servicepackage into the virtual environment.pip install ni-measurement-serviceCreate 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 environmentrefer to the official documentation.Create and Manage Python Measurement Package by directly installingni-measurement-serviceas a system-level packageMeasurement developers can also installni-measurement-serviceas a system package if necessary.Install theni-measurement-servicepackage from the command promptpip install ni-measurement-serviceCreate measurement modules as described in"Developing a minimal python measurement"