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.1.tar.gz (142.7 kB view details)

Uploaded Source

Built Distributions

rotpy-0.2.1-cp311-cp311-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.11 Windows x86-64

rotpy-0.2.1-cp311-cp311-win32.whl (9.4 MB view details)

Uploaded CPython 3.11 Windows x86

rotpy-0.2.1-cp311-cp311-manylinux_2_27_x86_64.whl (22.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.27+ x86-64

rotpy-0.2.1-cp311-cp311-macosx_10_14_x86_64.whl (15.7 MB view details)

Uploaded CPython 3.11 macOS 10.14+ x86-64

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

Uploaded CPython 3.10 Windows x86-64

rotpy-0.2.1-cp310-cp310-win32.whl (9.4 MB view details)

Uploaded CPython 3.10 Windows x86

rotpy-0.2.1-cp310-cp310-manylinux_2_27_x86_64.whl (21.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64

rotpy-0.2.1-cp310-cp310-macosx_10_14_x86_64.whl (15.7 MB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

rotpy-0.2.1-cp39-cp39-win_amd64.whl (12.4 MB view details)

Uploaded CPython 3.9 Windows x86-64

rotpy-0.2.1-cp39-cp39-win32.whl (9.4 MB view details)

Uploaded CPython 3.9 Windows x86

rotpy-0.2.1-cp39-cp39-manylinux_2_27_x86_64.whl (22.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.27+ x86-64

rotpy-0.2.1-cp39-cp39-macosx_10_14_x86_64.whl (15.7 MB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

rotpy-0.2.1-cp38-cp38-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.8 Windows x86-64

rotpy-0.2.1-cp38-cp38-win32.whl (9.7 MB view details)

Uploaded CPython 3.8 Windows x86

rotpy-0.2.1-cp38-cp38-manylinux_2_27_x86_64.whl (22.4 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.27+ x86-64

rotpy-0.2.1-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.1-cp37-cp37m-win_amd64.whl (13.0 MB view details)

Uploaded CPython 3.7m Windows x86-64

rotpy-0.2.1-cp37-cp37m-win32.whl (10.1 MB view details)

Uploaded CPython 3.7m Windows x86

rotpy-0.2.1-cp37-cp37m-manylinux_2_27_x86_64.whl (21.5 MB view details)

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

rotpy-0.2.1-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.1.tar.gz.

File metadata

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

File hashes

Hashes for rotpy-0.2.1.tar.gz
Algorithm Hash digest
SHA256 5975f18a6dc3f2af293d10f19dfd79960c92a55259a306e4eeaf0f42ea5d2374
MD5 599e6e4aa12b33cdb645071a08a16b07
BLAKE2b-256 988ff2dff737c0bbb478293543031d496c962c5f112542c0a600666b7c2434a9

See more details on using hashes here.

File details

Details for the file rotpy-0.2.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rotpy-0.2.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 12.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0

File hashes

Hashes for rotpy-0.2.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5f6897d58197b3fb2173e585b2eb110be65d62ad31a275fb8dda431d8ca7cdc5
MD5 36d05315f202d8c8a9af80f7a34d54b7
BLAKE2b-256 8833c656fe269bb561d403dabfecf95b16f73ddb1628b9b2f398468ec9a65d98

See more details on using hashes here.

File details

Details for the file rotpy-0.2.1-cp311-cp311-win32.whl.

File metadata

  • Download URL: rotpy-0.2.1-cp311-cp311-win32.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0

File hashes

Hashes for rotpy-0.2.1-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 e42501610b0bbe32ed93a0c9e2acd018bcc850076c572b25dfd5593c609f66c0
MD5 8d8547c93e9d3484bc30ea3386a5d31a
BLAKE2b-256 5e51789907e7b6e5ceb79b9f6955908783a944a5539c249c7898ea90b8f527cb

See more details on using hashes here.

File details

Details for the file rotpy-0.2.1-cp311-cp311-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.1-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 d40e26c536f31d4e68375d08d46c1a65e7f5eb98da9eb5ec140925b8e33aae66
MD5 aea301970632304364e3616031701a01
BLAKE2b-256 d05952c5b05635e5bf684ffc30767bc3bb970fb11378624f39cee5af888e2cae

See more details on using hashes here.

File details

Details for the file rotpy-0.2.1-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for rotpy-0.2.1-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 4d71d34935203af64020026350d010fe4f108fa31181dede6c845e93352b1a6f
MD5 4b11e4df0825410079af2cf970934811
BLAKE2b-256 73b04c246365dda9b166487d984246addd305ec50b3238594eec7f263e8e3629

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-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.8

File hashes

Hashes for rotpy-0.2.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8b9ccf65da9580dcd06d464fbca84291b1cddd96dac137351ac2a721b0786596
MD5 c0a4a27121a4c27796bedf84b4fb5187
BLAKE2b-256 e602820d1bcfd51268b6300d34e919d4a36104f3a6b45b5fc01e5d431166a7b0

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for rotpy-0.2.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 e902067941291adf1f5b7aefb1c46690cdb78161eb6d7128ad8393dda5e308ac
MD5 56edf3424090abe0c8844a108713c83d
BLAKE2b-256 c2275e4c77a7d5307093bba795b0ce818f124b6faa9240340012919e0ee88618

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 0245f7bf0c8e72d534f66d92be28f3f5b78f278e32bb1c6d14ad62ae952f608e
MD5 7ca9b76704987fcb2f753c862d682e9b
BLAKE2b-256 f1c36de6aaffc0f9bb2735653d5db9f64fe8ea052f4ea65a01ef187df0db70f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 279eda3a1b4bc3f9146dc72c7dd4ff7b43bae1b3ba8cbfd9ebab70bed3e83fe8
MD5 38bfa12b1b80c4b2728f5d9edd0d80f9
BLAKE2b-256 49a1dea3b73547b1902da4dfbbf6656af75819d99cc6a31656f5010c35a774da

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 12.4 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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 66adb96d8de80a3f802e9cd5767f57bd00934f5a87b377512d48e1610b23b35a
MD5 52a0714e3d9cd551c837df5810b694d5
BLAKE2b-256 69454ba4405e1ff254bda6a627b6e2764a17a45f5f40fdfa6d75813bdd63ea4b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp39-cp39-win32.whl
  • Upload date:
  • Size: 9.4 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.1-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 1fc21132708438f3d662517382fb8962ddfd1d4afa21c17715c9b288916dbc9f
MD5 2e0ada198448f5324e20c771f396bff8
BLAKE2b-256 f143973b425ed9249dd77f6517e9a81e2b0777c1eb08d8ff13dc8a061b1c566a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 9f2ed40bf6a6baa23408de546f54f75d14689239264f5f65b00a7b2c970760ca
MD5 9dd45043cb3e4fd54bd0ccc6bba986d7
BLAKE2b-256 66af8cf44bab8993ca73a3b3641a9dac06eda3c2acb6ef46473af63417721988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 3a6ab291592937a93be0d752b8e024e2889e07d225adef86ed507ba74c1b5fff
MD5 114a1fef148d17ef5b3034b8b28fd0c3
BLAKE2b-256 4f7cd706e2e14c5c76bc9f8d585cf85355262ea0038d78d6117659750687a3de

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 12.7 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.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8cd9a70f24549bb7fe03e54e24645abdf1fd5a1c0d52872c6adb4e5a3d625fa1
MD5 6cc26d8d9bc6f5d067c0f2baa0733b43
BLAKE2b-256 3aedf5d0cbe4f9303efd5fe761b1d6c84d07dd69ce4a844f3255df2cccf9d29f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp38-cp38-win32.whl
  • Upload date:
  • Size: 9.7 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.1-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 52b2fa70a39cb1634aebadd66245d5b14d941e469e35168f1eb84e208d19646f
MD5 b14dff53f76fb26c71a8fa08ca52aa27
BLAKE2b-256 c186614a3a8cb35d8a57e2c2b8d345916e91793085e6855168636f4762edc99f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 2551ce0241b348b1cef413eabeb3dcff4634ac043bdf05da4b28de83a228315f
MD5 ede3c4105afe9c8c1ccbe2b288c2bada
BLAKE2b-256 e24c08aadb611bcb33cb61b9de7ef8a73c8859f634fc33a485dc73f320f1cc9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7e04283ab07cc1af2b0d467846c00f604eee82b34b492fbc659b1e075f533708
MD5 b67e679b78268244641d785ac27b340f
BLAKE2b-256 325c3052b54315ae4d794c2e19e265509189324cb05383285c1baf07de56660e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 13.0 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.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 a105f96d120440db1d312dc47d118fcc03bc04bf9f3040e89ab00a2beb3fa57b
MD5 1f61f0154f1d3c57fd5a79587f95db8d
BLAKE2b-256 4dbfa99879a31a7a8d965e2bf97df4a670fde68973312d65759159b7a7df8ff0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.2.1-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 10.1 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.1-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 91e045f17024d16f09e89914e6fec5ab49d4a283f38711ca6b282f50eceac8b8
MD5 b6e47ae17c534dfbf6ef951670128d6c
BLAKE2b-256 ea2d6eab889279c8e5c74cf714011f7f0a31fbbbfa62f472f9edc0f341962a84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp37-cp37m-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 008361b0adeee80c106990df7436e4bd888a35ccf68721a3ec9e19988426bcf2
MD5 446af23f7e00bdcbee88efac2572314d
BLAKE2b-256 4d54bca601082dacf4f5901488bfcd9ef9d9f8757c97ca2c3851823cecfd1aa7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 03e9ff4e6419591e2c9e4133e81a4e85ecb471077294f40d55138db2b0a6829c
MD5 6beede66e2f45df4dbe38308612fe143
BLAKE2b-256 26382494dab4eb16e3752e24b4af54c9661108e2ab03c75051d2f354f4827c8c

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