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()

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 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()

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

Uploaded Source

Built Distributions

rotpy-0.1.0-cp310-cp310-win_amd64.whl (12.2 MB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 Windows x86

rotpy-0.1.0-cp310-cp310-manylinux_2_27_x86_64.whl (21.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64

rotpy-0.1.0-cp310-cp310-macosx_10_14_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 Windows x86

rotpy-0.1.0-cp39-cp39-manylinux_2_27_x86_64.whl (21.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.27+ x86-64

rotpy-0.1.0-cp39-cp39-macosx_10_14_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 Windows x86

rotpy-0.1.0-cp38-cp38-manylinux_2_27_x86_64.whl (21.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.27+ x86-64

rotpy-0.1.0-cp38-cp38-macosx_10_14_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

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

Uploaded CPython 3.7m Windows x86

rotpy-0.1.0-cp37-cp37m-manylinux_2_27_x86_64.whl (20.8 MB view details)

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

rotpy-0.1.0-cp37-cp37m-macosx_10_14_x86_64.whl (15.5 MB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

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

File metadata

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

File hashes

Hashes for rotpy-0.1.0.tar.gz
Algorithm Hash digest
SHA256 14395afed865be69ba09ab783349e37d799c2cf2f9071590535265dc20b43132
MD5 28648739315be5b8082d9da833f37843
BLAKE2b-256 8e4a16c71ef42df0daec5e45371ba176f26ae8e8228d93279715a3fbf6668b73

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 12.2 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.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7ba8b57470d6d93e1bd4d3104b0dd84c699f46a1d1e0f76b34dbb226d258433a
MD5 addfd1100a01f09326733997e415dbb3
BLAKE2b-256 5830d1a8c681a9b5d4b06bdf26d0d95b1dcd4993149518f7e7cfe45c5384b1f0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 2ffe3d6da2a9365205324d944247b3c3325b5996281390c8c2cdd06aa3a2847c
MD5 89f0e1307a10e62be734e03b51c5094a
BLAKE2b-256 010a73351d02fce9904844c477efcf8a9a9e35e5470b7d778521dbb536bafe94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 4affa58945ee506044684ed4ffe838e0d2b8ddb3f626b35ccbbbda83c2bf3e78
MD5 587968633372662a506d0047caca263b
BLAKE2b-256 f3f0060ac358e446209d73a149e9260d85e829b3877c6f2bdaacebc2792bd066

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 98df46b46de785a1dc1ccc3e34892a5a64a792957e5f3ca68643f19f8de9e127
MD5 1626a4c0f17f39115a5e475ff18a935f
BLAKE2b-256 09e5761b83c6cf7e5642b56b8365766a067f67ca95b85e4252a0387110864eaa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 605745791c3c50096f9c466ba5af94ba8b7b05c77f91c85c538e6e7985e168b7
MD5 cd0904c769e2d8e76841128a83a8f741
BLAKE2b-256 d01124a78353b4321098070b755f2732e3dd7a54ca2e656a60ea95e1e78830d2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 275dfa675708534c8d5b79ff089b788b5551d239565e42b5d95cb3b6ea4ecf85
MD5 c5ef3f064ac15caae04e6f2788c8ad54
BLAKE2b-256 91c9485bbaa6376be85f2e50c9ece7dde8b54210057dd650a5377973dc58e725

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp39-cp39-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 8c0a048a5375db642e0b6d57b6c0f2a72aa19be7b5b2be49d6baf6e5edc8f631
MD5 74b383579e7bfb68880f265ccc99e943
BLAKE2b-256 c7d80c64b78f1cef2014e6f39f0715669b2520d9f79a887e89b32803b4db7ef0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 bdd35a6f469740f3314ab6f5acf685fb6ee8599ffd984c05db3bb5cfa286218d
MD5 3218e8a31289fa6754be9994b639de36
BLAKE2b-256 2a787e789dd2716aba2fea776796572b69d27686698aebe1b1098f39fffa59be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 545266599d448a2a798493d2a6b1517b5a78b0a058eb9dde98af319513074e85
MD5 745a7bcac41ffa0e1ede1fb22103b3c9
BLAKE2b-256 94cee38cf551838fbf0cf87fa8f1904d1a8a2d0cee1b369345addb1f9b35ec4e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 50feb99fdf12ee2119fbfd02f477c310116185e844b80dae1a376583a0cb9262
MD5 79f27b91c94626e6093f051fe8931ffa
BLAKE2b-256 73524beea15fcd63133cf311dae16fe2eb96ec1b9a2d8645080e1351cb824d75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp38-cp38-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 1245b6101b00ae30515b1693c73b61af9561fedad62f238871532ec72a633fec
MD5 44cccdfdf2603bca201561b1ad0347f7
BLAKE2b-256 18ffec3d74709b8665002b63a02c4d4bf1e9b4c48ffd5115a9684e28e29c92a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 f5b089928f3ecb3d9bf5481d0aa7ac16dc2ed9a7ee66f5b4f61e7b7901a23dfb
MD5 5f3e6df55bced94b77fcf4f279d3d9f3
BLAKE2b-256 322a2267a5341744dbb3d96d7877c396520ff3c7255a724e72a0461ef40f27c5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b4ac794c0da219730161361d8fbaf91d6ba99fa33eb484e6edff6bfe27088603
MD5 f792f70e0ddd21a1ebe1d68184d1abd2
BLAKE2b-256 80e95bb8773947d82f41a6cbfb61fab635880f6d4ec73d1197322987e3686330

See more details on using hashes here.

File details

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

File metadata

  • Download URL: rotpy-0.1.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.1.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 fdcb0a776eb8381ce96edf31ac0115cb7437e7f457427e8b3681a48e16bc319f
MD5 a97c105946c8ad48736438c0d685e0be
BLAKE2b-256 3419189c215410929e3eec651b7091c66bd417e4cb5b2fbe9a162f31ad74e312

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp37-cp37m-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 dfd09debd157fda343d0377229b02e1def137055e8c8529daf385a3d08c2c3e9
MD5 8251aa8f22b99b9914313247537ec197
BLAKE2b-256 145644ccc4e216c78b11d339f78d9435e6c0f2f260e10ecd2bdb6da1902157c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rotpy-0.1.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 9aef1c00a556018da6ba6c20a85359a257a9bb6e642f7cd60b1bc97b6700e81f
MD5 c3c91a94fbc6de18404e940abd56ff5d
BLAKE2b-256 116900fe243fed2b2093e7a65ead60be8adbeba138e133413d2fc4d1e2a71264

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