Skip to main content

Cython bindings for the Spinnaker camera control API.

Project description

RotPy

RotPy provides python bindings for the Spinnaker SDK to enable Pythonic control of Teledyne/FLIR/Point Grey USB and GigE cameras.

See the website for the complete documentation.

Github CI status

Installation

You can install RotPy using pre-compiled wheels on Windows, Linux, or Mac or by installing the Spinnaker SDK and then installing RotPy from source.

Either way, you’ll likely need to install the Spinnaker drivers so that the cameras are recognized. Please download it from their website and follow the instructions to install the drivers if the cameras are not found.

Pre-compiled wheels

To install from the pre-compiled wheels (assuming it’s available on your platform), simply do:

python -m pip install rotpy

From source

To install RotPy from source, you need to:

  1. Install the Spinnaker SDK development libraries.

  2. Install a C++ compiler that supports C++11. E.g. on Windows Visual Studio etc. On Mac you may have to export the following environment variables:

    export CXX="/usr/bin/clang"
    export CXXFLAGS="-std=c++11"
    export CPPFLAGS="-std=c++11"
  3. Set the environment variables so Python can locate the Spinnaker SDK.

    1. You need to set ROTPY_INCLUDE to the include directory, e.g. on Windows it may be something like set ROTPY_INCLUDE="C:\Program Files\FLIR\Spinnaker\include". On Linux and Mac it should typically be automatically found.

    2. You need to set ROTPY_LIB to the paths that contain the libraries and binaries. E.g. on Windows it may be set ROTPY_LIB="C:\Program Files\FLIR\Spinnaker\bin64\vs2015;C:\Program Files\FLIR\Spinnaker\lib64\vs2015". On Linux and Mac, again, it should typically be automatically found.

  4. Then install RotPy with:

    python -m pip install rotpy --no-binary rotpy
  5. At runtime, you’ll need to ensure the Spinnaker runtime binaries are on the system PATH using e.g. os.add_dll_directory.

    You may also have to set the environmental variable (depending on the OS bitness) GENICAM_GENTL32_PATH/GENICAM_GENTL64_PATH to the directory containing the FLIR_GenTL*.cti file as well as any or all variables FLIR_GENTL32_CTI_VS140/FLIR_GENTL64_CTI_VS140/FLIR_GENTL32_CTI/FLIR_GENTL64_CTI to the full path to the FLIR_GenTL*.cti file.

    Additionally, the FLIR_GenTL*.cti file containing directory may also need to be added to the system PATH. Spinnaker will raise an error if the cti file cannot be loaded.

Examples

Getting an image from a GigE camera

>>> from rotpy.system import SpinSystem
>>> from rotpy.camera import CameraList
>>> # get a system ref and a list of all attached cameras
>>> system = SpinSystem()
>>> cameras = CameraList.create_from_system(system, update_cams=True, update_interfaces=True)
>>> cameras.get_size()
    1
>>> # get the camera attached from the list
>>> camera = cameras.create_camera_by_index(0)
>>> camera.get_unique_id()
    '77T45WD4A84C_86TA1684_GGGGGG14_64CW3987'
>>> # init the camera and get one image
>>> camera.init_cam()
>>> # get its serial number
>>> camera.camera_nodes.DeviceSerialNumber.get_node_value()
'36548975'
>>> camera.begin_acquisition()
>>> image_cam = camera.get_next_image(timeout=5)
>>> # we copy the image so that we can release its camera buffer
>>> image = image_cam.deep_copy_image(image_cam)
>>> image_cam.release()
>>> camera.end_acquisition()
>>> # save the image
>>> image.save_png('image.png')
>>> # get image metadata
>>> image.get_bits_per_pixel()
    8
>>> image.get_height()
    512
>>> image.get_width()
    612
>>> image.get_frame_id()
    1
>>> image.get_frame_timestamp()
    67557050882
>>> image.get_pix_fmt()
    'Mono8'
>>> image.get_image_data_size()
    313344
>>> data = image.get_image_data()
>>> type(data)
    bytearray
>>> len(data)
    313344
>>> 512 * 612
    313344
>>> camera.deinit_cam()
>>> camera.release()

Configuring and getting an image from a USB3 camera

>>> from rotpy.system import SpinSystem
>>> from rotpy.camera import CameraList
>>> # create system/camera list instance and create the camera by serial number
>>> system = SpinSystem()
>>> cameras = CameraList.create_from_system(system, True, True)
>>> cameras.get_size()
1
>>> camera = cameras.create_camera_by_serial('87785435')
>>> # init so we can read the pixel format node
>>> camera.init_cam()
>>> # the names of the pixel formats available for the camera
>>> camera.camera_nodes.PixelFormat.get_entries_names()
['Mono8',
 'Mono12Packed',
 'Mono12p',
 'Mono16',
 'BayerGR8',
 ...,
 'BayerBG16',
 'YCbCr411_8_CbYYCrYY',
 'YCbCr422_8_CbYCrY',
 'YCbCr8_CbYCr',
 'RGB8']
>>> # the current one is BayerRG8
>>> node = camera.camera_nodes.PixelFormat.get_node_value()
>>> node
<rotpy.node.SpinEnumItemNode at 0x236edec43c8>
>>> node.get_enum_name()
'BayerRG8'
>>> # instead set it to RGB8
>>> camera.camera_nodes.PixelFormat.set_node_value_from_str('RGB8')
>>> camera.camera_nodes.PixelFormat.get_node_value().get_enum_name()
'RGB8'
>>> # set acquired image height to 800 pixels
>>> camera.camera_nodes.Height.get_node_value()
1200
>>> camera.camera_nodes.Height.set_node_value(800)
>>> camera.camera_nodes.Height.get_node_value()
800
>>> camera.camera_nodes.Height.get_max_value()
1200
>>> # get the current framerate
>>> camera.camera_nodes.AcquisitionFrameRate.is_readable()
True
>>> camera.camera_nodes.AcquisitionFrameRate.get_node_value()
42.7807502746582
>>> # get one image and copy and release it so we don't tie up the buffers
>>> camera.begin_acquisition()
>>> image_cam = camera.get_next_image()
>>> image = image_cam.deep_copy_image(image_cam)
>>> image_cam.release()
>>> camera.end_acquisition()
>>> # get some image metadat
>>> image.get_frame_timestamp() / 1e9
512.51940629
>>> image.get_height()
800
>>> image.get_buffer_size()
4608000
>>> 1920*800*3
4608000
>>> image.get_pix_fmt()
'RGB8'
>>> # cleanup
>>> camera.deinit_cam()
>>> camera.release()

System and camera properties

The system and camera properties can be read and set using node objects. These nodes, each represent a camera or system property, and they can be integer nodes, float nodes, boolean nodes, string nodes, command nodes etc.

These nodes derive from Spinnaker’s GenICam implementation for their cameras. RotPy provides access to a generic node access API as well as to some pre-listed nodes available on many cameras.

The generic API is accessed through the NodeMap using e.g. SpinSystem.get_tl_node_map, InterfaceDevice.get_tl_node_map, Camera.get_node_map, Camera.get_tl_dev_node_map, or Camera.get_tl_stream_node_map.

The pre-listed nodes can be accessed through e.g. SpinSystem.system_nodes, InterfaceDevice.interface_nodes, Camera.camera_nodes, Camera.tl_dev_nodes, or Camera.tl_stream_nodes. These link to the following respective objects: SystemNodes, InterfaceNodes, CameraNodes, TLDevNodes, and TLStreamNodes.

E.g. to access some of the system nodes using system_nodes:

>>> from rotpy.system import SpinSystem
>>> system = SpinSystem()
>>> # get a list of all boolean nodes
>>> system.system_nodes.bool_nodes
['EnumerateGEVInterfaces', 'EnumerateUSBInterfaces', 'EnumerateGen2Cameras']
>>> # let's inspect the USB node
>>> system.system_nodes.EnumerateUSBInterfaces
<rotpy.node.SpinBoolNode at 0x26822c20d68>
>>> # first make sure this node is actually available for this system
>>> system.system_nodes.EnumerateUSBInterfaces.is_available()
True
>>> system.system_nodes.EnumerateUSBInterfaces.get_node_value()
True
>>> system.system_nodes.EnumerateUSBInterfaces.get_description()
'Enables or disables enumeration of USB Interfaces.'
>>> system.system_nodes.EnumerateUSBInterfaces.get_name()
'EnumerateUSBInterfaces'
>>> system.system_nodes.EnumerateUSBInterfaces.get_node_value_as_str()
'1'
>>> system.system_nodes.EnumerateUSBInterfaces.get_short_description()
'Enables or disables enumeration of USB Interfaces.'

We can similarly use the node map to get the same node if it’s available:

>>> from rotpy.system import SpinSystem
>>> system = SpinSystem()
>>> node_map = system.get_tl_node_map()
>>> node = node_map.get_node_by_name('EnumerateUSBInterfaces')
>>> node is not None and node.is_available()
True
>>> node.get_node_value()
True
>>> node.get_description()
'Enables or disables enumeration of USB Interfaces.'

Similarly, for the camera, we can use the pre-listed nodes:

>>> # make sure to init the camera, otherwise many nodes won't be available
>>> camera.init_cam()
>>> # check that the auto-exposure setting is available
>>> camera.camera_nodes.ExposureAuto.is_available()
True
>>> camera.camera_nodes.ExposureAuto.get_description()
'Sets the automatic exposure mode when Exposure Mode is Timed.'
>>> # the auto-exposure is a enum node with children items
>>> camera.camera_nodes.ExposureAuto.get_node_value()
<rotpy.node.SpinEnumItemNode at 0x26822c2bc18>
>>> camera.camera_nodes.ExposureAuto.get_node_value().get_enum_name()
'Continuous'
>>> # but we can just get the symbolic string name directly
>>> camera.camera_nodes.ExposureAuto.get_node_value_as_str()
'Continuous'
>>> # to see what options are available for this enum node, look in the names module
>>> from rotpy.names.camera import ExposureAuto_names
>>> ExposureAuto_names
{'Off': 0, 'Once': 1, 'Continuous': 2}
>>> # or for pre-listed enum nodes, we can get it as an attribute
>>> camera.camera_nodes.ExposureAuto.enum_names
{'Off': 0, 'Once': 1, 'Continuous': 2}
>>> # try setting it to an incorrect value
>>> camera.camera_nodes.ExposureAuto.set_node_value_from_str('off', verify=True)
Traceback (most recent call last):
  File "<ipython-input-48-d16a67f0044c>", line 1, in <module>
    camera.camera_nodes.ExposureAuto.set_node_value_from_str('off', verify=True)
  File "rotpy\node.pyx", line 650, in rotpy.node.SpinValueNode.set_node_value_from_str
    cpdef set_node_value_from_str(self, str value, cbool verify=True):
  File "rotpy\node.pyx", line 664, in rotpy.node.SpinValueNode.set_node_value_from_str
    self._value_handle.FromString(s, verify)
RuntimeError: Spinnaker: GenICam::InvalidArgumentException= Feature 'ExposureAuto' : cannot convert value 'off', the value is invalid. : InvalidArgumentException thrown in node 'ExposureAuto' while calling 'ExposureAuto.FromString()' (file 'Enumeration.cpp', line 132) [-2001]
>>> # now set it correctly
>>> camera.camera_nodes.ExposureAuto.set_node_value_from_str('Off', verify=True)
>>> camera.camera_nodes.ExposureAuto.get_node_value_as_str()
'Off'

Similarly, we can use the node map to set the exposure back to "Continuous":

>>> node_map = camera.get_node_map()
>>> node = node_map.get_node_by_name('ExposureAuto')
>>> node is not None and node.is_available()
True
>>> node.get_node_value_as_str()
'Off'
>>> node.set_node_value_from_str('Continuous', verify=True)
>>> node.get_node_value_as_str()
'Continuous'
>>> # now de-init the camera and the node won't be available
>>> camera.deinit_cam()
>>> node.is_available()
False
>>> camera.camera_nodes.ExposureAuto.is_available()
False

Attaching event handlers

Camera detection events

We can register callbacks to be called when the system detects a camera arrival or removal on any interface, or on specific interfaces. E.g. to be notified on any interface:

>>> from rotpy.system import SpinSystem
>>> system = SpinSystem()
>>> # register a callback for both arrival and removal
>>> def arrival(handler, system, serial):
...     print('Arrived:', serial)
>>> def removal(handler, system, serial):
...     print('Removed:', serial)
>>> # register and then plug and unplug a camera twice
>>> handler = system.attach_interface_event_handler(arrival, removal, update=True)
Arrived: 36548975
Removed: 36548975
Arrived: 36548975
Removed: 36548975
>>> system.detach_interface_event_handler(handler)

Logging handler

We can also register logging event handlers to get any logging events on the system or devices:

>>> from rotpy.system import SpinSystem
>>> from rotpy.camera import CameraList
>>> # create system and set logging level to debug
>>> system = SpinSystem()
>>> system.set_logging_level('debug')
>>> # create a callback that prints the message
>>> def log_handler(handler, system, item):
...     print('Log:', item['category'], item['priority'], item['message'])
>>> # attach the callback and do something that causes logs
>>> handler = system.attach_log_event_handler(log_handler)
>>> cameras = CameraList.create_from_system(system, update_cams=True, update_interfaces=True)
Log: SpinnakerCallback DEBUG Spinnaker: GetCameras()
Log: GenTLCallback DEBUG Entering InterfaceGev::InterfaceGev()
Log: GenTLCallback DEBUG Leaving InterfaceGev::InterfaceGev()
Log: GenTLCallback DEBUG GenTL Trace: system.cpp, line 125, GenTL::EnumerateGigEInterfaces
Log: GenTLCallback DEBUG Entering HAL_UsbGetInterfaces()
Log: GenTLCallback DEBUG Enumerating host Controller PCI\VEN_8086&DEV_A12F&SUBSYS_06E41028&REV_31\3&11458735&0&A0
Log: GenTLCallback DEBUG Host Controller's child instance ID: USB\VID_8087&PID_0029\5&587A6F87&0&4
Log: GenTLCallback DEBUG Entering InterfaceUsb::InterfaceUsb()
Log: GenTLCallback DEBUG Leaving InterfaceUsb::InterfaceUsb()
Log: GenTLCallback DEBUG GenTL Trace: system.cpp, line 162, GenTL::EnumerateUsbInterfaces
Log: GenTLCallback DEBUG GenTL Trace: system.cpp, line 191, GenTL::InitializeInterfaces
Log: GenTLCallback DEBUG GenTL Trace: system.cpp, line 225, GenTL::System::RefreshInterfaces
Log: GenTLCallback DEBUG GenTL Trace: system.cpp, line 535, GenTL::System::UpdateInterfaceList
>>> # now detach the handler
>>> system.detach_log_event_handler(handler)

Camera image handler

We can also register a callback that is called on every new image that is received from the device, as opposed to polling for new images:

>>> from rotpy.camera import CameraList
>>> from rotpy.system import SpinSystem
>>> # create system and get a camera
>>> system = SpinSystem()
>>> cameras = CameraList.create_from_system(system, update_cams=True, update_interfaces=True)
>>> camera = cameras.create_camera_by_index(0)
>>> camera.init_cam()
>>> # create an image handler that prints the frame ID and time
>>> def image_callback(handler, camera, image):
...     print('Image:', image.get_frame_id(), image.get_frame_timestamp())
>>> # attach callback and start getting frames
>>> handler = camera.attach_image_event_handler(image_callback)
>>> camera.begin_acquisition()
Image: 1 388361262364
Image: 2 388366605529
 ...
Image: 135 389077033335
>>> # stop frames and printing
>>> camera.end_acquisition()
>>> camera.detach_image_event_handler(handler)
>>> camera.deinit_cam()
>>> camera.release()

Camera events

We can also register a callback that is called on camera events. E.g.:

>>> from rotpy.camera import CameraList
>>> from rotpy.system import SpinSystem
>>> # create system and get a camera
>>> system = SpinSystem()
>>> cameras = CameraList.create_from_system(system, update_cams=True, update_interfaces=True)
>>> camera = cameras.create_camera_by_index(0)
>>> camera.init_cam()
>>> # define the callback and attach it
>>> def event_callback(handler, camera, event):
...     print('Event:', event, handler.get_event_data(event), handler.get_event_metadata())
>>> handler = camera.attach_device_event_handler(event_callback)
>>> # now use the EventSelector enum to get the enum items which
>>> correspond to the event names that are available.
>>> nodes = camera.camera_nodes.EventSelector.get_entries()
>>> # not all are actually available, so only activate the ones available
>>> nodes = [node for node in nodes if node.is_available()]
>>> for node in nodes:
...     print(node.get_enum_name())
...     camera.camera_nodes.EventSelector.set_node_value_from_str(node.get_enum_name())
...     camera.camera_nodes.EventNotification.set_node_value_from_str('On')
ExposureEnd
>>> # this printed just ExposureEnd, indicating only this event was available
>>> # start acquisition so that the events occur
>>> camera.begin_acquisition()
Event: EventExposureEnd {'frame_id': 62629213124996} ('device', 'EventExposureEnd', 40003)
Event: EventExposureEnd {'frame_id': 62633508092293} ('device', 'EventExposureEnd', 40003)
...
Event: EventExposureEnd {'frame_id': 62676457765304} ('device', 'EventExposureEnd', 40003)
>>> camera.end_acquisition()
>>> camera.detach_device_event_handler(handler)
>>> camera.deinit_cam()
>>> camera.release()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rotpy-0.2.0.tar.gz (141.8 kB view details)

Uploaded Source

Built Distributions

rotpy-0.2.0-cp310-cp310-win_amd64.whl (12.3 MB view details)

Uploaded CPython 3.10 Windows x86-64

rotpy-0.2.0-cp310-cp310-win32.whl (9.3 MB view details)

Uploaded CPython 3.10 Windows x86

rotpy-0.2.0-cp310-cp310-manylinux_2_27_x86_64.whl (21.7 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64

rotpy-0.2.0-cp310-cp310-macosx_10_14_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

rotpy-0.2.0-cp39-cp39-win_amd64.whl (12.3 MB view details)

Uploaded CPython 3.9 Windows x86-64

rotpy-0.2.0-cp39-cp39-win32.whl (9.3 MB view details)

Uploaded CPython 3.9 Windows x86

rotpy-0.2.0-cp39-cp39-manylinux_2_27_x86_64.whl (21.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.27+ x86-64

rotpy-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

rotpy-0.2.0-cp38-cp38-win_amd64.whl (12.6 MB view details)

Uploaded CPython 3.8 Windows x86-64

rotpy-0.2.0-cp38-cp38-win32.whl (9.6 MB view details)

Uploaded CPython 3.8 Windows x86

rotpy-0.2.0-cp38-cp38-manylinux_2_27_x86_64.whl (22.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.27+ x86-64

rotpy-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

rotpy-0.2.0-cp37-cp37m-win_amd64.whl (12.9 MB view details)

Uploaded CPython 3.7m Windows x86-64

rotpy-0.2.0-cp37-cp37m-win32.whl (10.0 MB view details)

Uploaded CPython 3.7m Windows x86

rotpy-0.2.0-cp37-cp37m-manylinux_2_27_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.27+ x86-64

rotpy-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

Details for the file rotpy-0.2.0.tar.gz.

File metadata

  • Download URL: rotpy-0.2.0.tar.gz
  • Upload date:
  • Size: 141.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for rotpy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 cf46f22b70b66d52bb99c9ae5849fc7b29ea8dcd95ef5384f3bed0de2b9af93a
MD5 91088e356561b0978643cee38ff7f362
BLAKE2b-256 690ecabec5fb60f91c4b49df5b31390cee2ea9eed07c32d15f7743aa1a2cb14c

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 12.3 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for rotpy-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fa7511f8fc5a51c103cd2a4d47d6b19389cf1f0c7f29976612a170cef8e25fca
MD5 a81e83609c172f7714540d715bc0a0c4
BLAKE2b-256 f497852fa5fc3125a3a1d86121b0bf11bf554f5f751d104265374f2a21be07ca

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 9.3 MB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for rotpy-0.2.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 be872a9e862f958f68ae4d1550c22f6a9967597dddbd5a4e3304598f78eee58e
MD5 7855720f2f6fc08acb3bb2c4820a5224
BLAKE2b-256 a1f4c2d48d40604e74758eeb9ecdc8d7a68d5675719ded74ef786462ab9fff01

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp310-cp310-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 98f889c0670f94d6d81de966319b10f6bc00f229f34a19384df96114d3976123
MD5 9b457c28ff782de4778779b66f24552e
BLAKE2b-256 17913c7c4e92db27ffabcdf74d76d44c882f173cc2a18b1d4048c518e7833e9a

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 fa109b94e0d95d6f97b3433b11bd9dc1b463dfb7be4371d46d19912d4f3dbeff
MD5 ad667e1e4c31915f3b98c0e193975316
BLAKE2b-256 0a6d53d6bb1bec7b2a17a3e114affb4a0abc8b0b59f77ab7142e6c244f813092

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 12.3 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for rotpy-0.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6821b3b790b27edc026d3f7e5072c20c4d39cd6bdab3cb81d499cfbc5f5a633b
MD5 35f44ecac8ac2d6ceac71907f44f9c93
BLAKE2b-256 72a589480d3ba661236518986d196c9bc355ff3d41b620be1e58129845c50516

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp39-cp39-win32.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 9.3 MB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for rotpy-0.2.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 076fb7d46c950525fddc0ebf16996a440cb14255dfd8db9a649d35d2aa0c773f
MD5 2f7b460a5c3161f92941ce9941f5ae21
BLAKE2b-256 913cab9336eadc88639c8ed798a2e9a6557a90f4fdb82be51041284acb726754

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp39-cp39-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 da75999c31c73abce2a7cdd78227b772946e2ed2e1401b2d4e8c62f897e64e42
MD5 cb2e7c1daa2dddf5afe4b8c71ee40e29
BLAKE2b-256 860f149d849555a76d35218849714546f46c4bce3b344ba8a97d523c0176ad37

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 53f8322127b97e234a4881dcd3ed5a89132e11a0ba6bd2b7942a4434e6a7b473
MD5 08a6c0424d3d95652da08a30c49b5b44
BLAKE2b-256 547b4077a7c824eeb92381d69f1d11931be8eecfe5a4ab550757692eb3bbd59a

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for rotpy-0.2.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3ef165989fbab1a0c8554df1d90ce094d8005b42ad34ed4fd45660d216bcb96d
MD5 dd6e054cd094470ee6c55db4a24a3105
BLAKE2b-256 70305aad4549f9a8c74eda958ad6cf1bc627fd98c11da8fb470d31fb6ed31035

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp38-cp38-win32.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 9.6 MB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for rotpy-0.2.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 1e6d123e3e36cd36435c2d900676de2be3fa4c00e9f5e45df45e265e8fc5d699
MD5 346821eb995bd348b651166562793c53
BLAKE2b-256 125d821d6dbd9fbfca9b25b0cf9b1b9606c32aee3054348a62f29edb9095e00d

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp38-cp38-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 094fb0d957eb787af5478304cbec6e3b8f5ba5866559c5537d2100c44fe64629
MD5 b95fef0843ed6b8e258033893c9e281f
BLAKE2b-256 844e37e20463f1aaf6c59b7abcc7c7e849511b7707e9e78e7c71209718ab75f6

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 75aa6e81a5a9974ce3105520cb22634a612a4024ecda6dfecb5ee9b0096b9f47
MD5 9bdb0c7d15ba9c22cc3e159c11b136c6
BLAKE2b-256 dcff6934197fec41bb44a9e903200bec7ce5743afda444d2e8fe7376ef547d00

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 12.9 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for rotpy-0.2.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 a0a1f9cba2660aef779b59efd548a2b85f9b02f9d638c0f159f378e1bc2fb052
MD5 e08ec590bcd4af69d17d5d31b68b22a6
BLAKE2b-256 aba5dcf0c79d4e1c63091b407f5072459a5208c9e452ce7e145f706bad1d465d

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp37-cp37m-win32.whl.

File metadata

  • Download URL: rotpy-0.2.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.7.9

File hashes

Hashes for rotpy-0.2.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 95092e69e2ac3a3475fe27a4db9e7ca75688f3298866ebfe698effef7fa160f3
MD5 545537b7d9ede4a37db04f07f4521a28
BLAKE2b-256 7f691dcd63ae45b889fa53a61cfdd196c77b37c0463ef8bfc9bfc86cf5963e75

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp37-cp37m-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp37-cp37m-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 b9895f01c4994ab45afd29102ab03cb9d84d7938860d31e81adb2d9639d3f0f1
MD5 82a13445f1bb435cb2b2fa85967d7c35
BLAKE2b-256 5d9646ab52750bbfad9e302b8294e5885da274ecfb50c1131942871932f7eb3b

See more details on using hashes here.

File details

Details for the file rotpy-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 8629c369d7c1b1ef4bf147132ddb16b89e24a051240a37f260615476a28ce41e
MD5 c045fc5323bbc440b47bedafaf83f4b2
BLAKE2b-256 b4aaeecc9cab74950ad51221035a3e4d32ad76eda433df800cc651f6ea730d66

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page