Skip to main content

Python library for EPICS PV Access

Project description

PvaPy - PvAccess for Python

The PvaPy package is a Python API for EPICS4. It supports both PVA and CA providers, all standard EPICS4 types (structures, scalars, unions, etc), standard set of channel operations (put/get, monitor), RPC client/server, PVA server, etc. It uses Boost/Python to wrap EPICS4 C++ libraries and APIs, and is currently supported on the Unix-like operating systems (Linux, OSX).

Installation

At the moment prebuilt PvaPy packages exist for the Conda and PyPI package management system. If none of the prebuilt packages work for you, or if you need 32-bit Linux packages, you will have to build PvaPy from sources.

Conda

  • Supported platforms: Linux (64-bit), OSX
  • Supported Python versions: Python2, Python3

Make sure conda command is in your path, and execute the following command:

  $ conda install -c epics pvapy

This should result in installation of pvapy, pvapy-boost and epics-base Conda packages.

PyPI

  • Supported platforms: Linux (64-bit)
  • Supported Python versions: Python2, Python3

Make sure pip command is in your path, and execute the following command:

  $ pip install pvapy

PvaPy pip packages contain all needed epics base and boost libraries.

Build

This section is intended for those users that would like to build PvaPy from the source code.

Prerequisites

Building PvaPy from source requires recent versions of the following software:

  1. Standard development tools (gcc, make, autoconf, etc.)
  2. Python development header files/libraries (>=v2.6.6)
  3. Sphinx/Sphinx RTD Theme (optional, for generating documentation)

There are two ways of building and installing PvaPy from sources: automated and custom. The automated local install will download and build predefined versions of EPICS Base, Boost and PvaPy. Custom local install relies on already existing EPICS Base and Boost libraries, and builds only PvaPy.

Automated Build

Make sure the desired version of Python is in your path, and execute the following command from the top of the PvaPy source directory:

  $ PREFIX=/local/install/path make local

This should build and install predefined versions of EPICS Base, Boost Python and PvaPy libraries under the directory specified by the PREFIX variable. If PREFIX is not specified, all software will be installed under the tools/local subdirectory of the PvaPy distribution.

Custom Build

In addition to the Python-related prerequsites, the custom build requires the following software already built:

  1. EPICS Base (>=v3.14.12.3)
  2. EPICS4 CPP release (>=v4.4.0); note that EPICS7 release includes all needed v4 modules
  3. Boost (>=v1.41.0); must have the boost_python library built
  4. Boost.NumPy (optional, for retrieving numeric scalar arrays as numpy arrays; this is not needed for Boost v1.63.0 and later)

The version numbers mentioned above are the earliest that PvaPy was tested with. Any recent version of Python and the Boost libraries (such as those that come with current linux distributions) should work. Similarly, any recent version of EPICS Base that is supported by EPICS4 CPP should be fine.

Nothing special needs to be done when building the EPICS4 CPP modules. Ensure that the EPICS Base installation you use for this module is the same one that was used to build the EPICS4 modules.

This module has not been adapted for use on Microsoft Windows. Only Unix-like operating systems (e.g. Linux, MacOS, Solaris) are currently supported.

1. Configure PvaPy

This can be done manually, or using autoconf.

For manual configuration: Read the comments in both the configure/RELEASE and configure/CONFIG_SITE files and follow the instructions given there.

For automatic configuration: In the top level directory run

  $ make configure EPICS_BASE=/epics/base/path [EPICS4_DIR=/epics/v4/path] [BOOST_NUM_PY_DIR=/boost.numpy/path] [BOOST_ROOT=/boost/path] [PYTHON_VERSION=3]

Note that you can only use the automatic configuration if the v4 modules have not been renamed. In the above command replace /epics/base/path with the full path to your EPICS Base directory, and /epics/v4/path with the full path to your top level directory containing the v4 modules pvDataCPP, pvAccessCPP, etc. If you are using EPICS7 release, you can omit EPICS4_DIR argument, as configuration scripts will find the required v4 libraries and header files in the EPICS Base directory.

The optional BOOST_NUM_PY_DIR argument enables NumPy array support for older Boost versions, as v1.63.0 and later releases already include NumPy libraries. The optional BOOST_ROOT argument is typically used for custom Boost installation directory. In case you are using custom python installation that uses shared object libraries, you may need to set PATH and LD_LIBRARY_PATH environment variables before running the above make configure command. Also, note that building with python 3.x requires PYTHON_VERSION=3 argument.

The make configure command will check for your Boost/Python libraries, and create suitable configure/RELEASE.local and configure/CONFIG_SITE.local files that are used by the build process. They should look roughly like the examples below:

  $ cat RELEASE.local
  PVACLIENT = /home/epics/v4/pvaClientCPP
  PVDATABASE = /home/epics/v4/pvDatabaseCPP
  NORMATIVETYPES = /home/epics/v4/normativeTypesCPP
  PVACCESS = /home/epics/v4/pvAccessCPP
  PVDATA = /home/epics/v4/pvDataCPP
  EPICS_BASE = /home/epics/base-3.15.5

  $ cat CONFIG_SITE.local
  PVA_PY_CPPFLAGS = -I/usr/include -I/usr/include/python2.7
  PVA_PY_LDFLAGS = -L/usr/lib64 -lpython2.7
  PVA_PY_SYS_LIBS = boost_python  
  PVA_API_VERSION = 480
  PVA_RPC_API_VERSION = 480
  HAVE_BOOST_NUM_PY = 0
  HAVE_BOOST_PYTHON_NUM_PY = 0
  PYTHON_VERSION = 2.7
  PVA_PY_PYTHON = /bin/python
  PVA_PY_PYTHONPATH = /home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64
  PVA_PY_LD_LIBRARY_PATH = /usr/lib64
  PVA_PY_EPICS_BASE = /home/epics/base-3.15.5
  PVA_PY_EPICS4_DIR = /home/epics/v4
  PVA_PY_HOST_ARCH = linux-x86_64
  PVA_PY_SETUP_SH = /home/epics/pvaPy/bin/linux-x86_64/pvapy_setup_full.2.7.sh

The above files were created automatically on a 64-bit RHEL 7.4 machine, with the following boost/python packages installed:

  $ rpm -q boost-python python-devel
  boost-python-1.53.0-27.el7.x86_64
  python-devel-2.7.5-58.el7.x86_64

Note that the automatic configuration process also creates pvapy_setup_full.$PYTHON_VERSION.(c)sh and pvapy_setup_pythonpath.$PYTHON_VERSION.(c)sh files in the bin/$EPICS_HOST_ARCH directory. The full setup files modify PATH, LD_LIBRARY_PATH and PYTHONPATH environment variables, while the pythonpath setup files modify only PYTHONPATH variable. For example,

  $ cat pvapy_setup_pythonpath.2.7.sh
  #!/bin/sh
  #
  # modifies PYTHONPATH environment variable
  #
  if test -z "$PYTHONPATH" ; then
      export PYTHONPATH=/home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64
  else
      export PYTHONPATH=/home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64:$PYTHONPATH
  fi

After building pvaPy, the environment setup files can be sourced to use the built python module, e.g.:

  $ . /home/epics/v4/pvaPy/bin/linux-x86_64/pvapy_setup_pythonpath.2.7.sh
  $ echo $PYTHONPATH
  /home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64

or for csh users:

  % source /home/epics/v4/pvaPy/bin/linux-x86_64/pvapy_setup_pythonpath.2.7.csh
  % echo $PYTHONPATH
  /home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64

2. Compile PvaPy Source

In the top level package directory run:

  $ make

The above command will create and install a loadable library pvaccess.so under the lib/python directory which can be imported directly by Python.

3. Generate Documentation

This step is optional and requires Sphinx to be installed:

  $ make doc

If a sphinx-build script is present on the system, html pages will be generated in the documentation/sphinx/_build/html directory.

Basic Usage: PV put/get

For simple testing, do the following:

  1. In a separate terminal, start the testDbPv IOC:
  $ cd $EPICS4_DIR/pvaSrv/testTop/iocBoot/testDbPv
  $ ../../bin/$EPICS_HOST_ARCH/testDbPv st.cmd
  1. Source the appropriate setup file from pvaPy's bin/$EPICS_HOST_ARCH directory and start python (the Python PVA module is called pvaccess):
  $ python
  >>> import pvaccess
  >>> dir (pvaccess)
  ['BOOLEAN', 'BYTE', 'CA', 'Channel', 'DOUBLE', 'FLOAT', 'FieldNotFound',
  'INT', 'InvalidArgument', 'InvalidDataType', 'InvalidRequest', 'LONG',
  'NtTable', 'NtType', 'PVA', 'ProviderType', 'PvAlarm', 'PvBoolean', 'PvByte',
  'PvDouble', 'PvFloat', 'PvInt', 'PvLong', 'PvObject', 'PvScalar',
  'PvScalarArray', 'PvShort', 'PvString', 'PvTimeStamp', 'PvType', 'PvUByte',
  'PvUInt', 'PvULong', 'PvUShort', 'PvUnion', 'PvaException', 'RpcClient',
  'RpcServer', 'SHORT', 'STRING', 'UBYTE', 'UINT', 'ULONG', 'USHORT', '__doc__',
  '__file__', '__name__', '__package__']
  >>> c = pvaccess.Channel('int01')
  >>> print c.get()
  epics:nt/NTScalar:1.0
      int value 0
  >>> c.putInt(7)
  >>> print c.get()
  epics:nt/NTScalar:1.0
      int value 7
  >>> c.put(pvaccess.PvInt(5))
  >>> print c.get()
  epics:nt/NTScalar:1.0
      int value 5

In the above, note that in addition to PV object classes like PvInt, one can also use standard Python types as arguments for channel puts.

Basic Usage: PV monitor

  1. In a separate terminal, start the testDbPv IOC:
  $ cd $EPICS4_DIR/pvaSrv/testTop/iocBoot/testDbPv
  $ ../../bin/$EPICS_HOST_ARCH/testDbPv st.cmd
  1. PV values can be changed using the IOC shell command dbpf, e.g:
  epics> dbpr 'float01'
  ASG:                DESC:               DISA: 0             DISP: 0
  DISV: 1             NAME: float01       SEVR: MAJOR         STAT: LOLO
  TPRO: 0             VAL: 0
  epics> dbpf 'float01' 11.1
  DBR_FLOAT:          11.1
  1. Monitor a channel in Python, passing in a subscriber object (function that processes PvObject instance):
  >>> c = pvaccess.Channel('float01')
  >>> def echo(x):
  ...     print 'New PV value:', x
  ...
  >>> c.subscribe('echo', echo)
  >>> c.startMonitor()
  >>> New PV value: epics:nt/NTScalar:1.0
      float value 11.1

  New PV value: epics:nt/NTScalar:1.0
      float value 11.2

  New PV value: epics:nt/NTScalar:1.0
      float value 11.3

  >>> c.stopMonitor()

Advanced Usage: PVA Server Class

  1. In terminal 1, create a simple 'pair' channel:
  $ python 
  >>> pv = PvObject({'x': INT, 'y' : INT})
  >>> pvaServer = PvaServer('pair', pv)
  1. In terminal 2, start monitoring this channel:
  $ pvget -m pair
  1. In terminal 1, update one of the object's fields:
  >>> pv['x'] = 1

This change should appear in terminal 2.

Advanced Usage: RPC Client Class

  1. In a separate terminal, start the v4 test RPC service:
  $ cd $EPICS4_DIR/pvAccessCPP/bin/$EPICS_HOST_ARCH
  $ ./rpcServiceExample # in terminal 2
  1. RPC test channel is 'sum':
  >>> rpc = pvaccess.RpcClient('sum')
  >>> request = pvaccess.PvObject({'a': pvaccess.STRING, 'b': pvaccess.STRING})
  >>> request.set({'a': '11', 'b': '22' })
  >>> print request
  structure
      string a 11
      string b 22
  >>> response = rpc.invoke(request)
  >>> print response
  structure
      double c 33

Advanced Usage: RPC Server Class

Example 1

  1. In a separate terminal, source the environment file and start python:
  $ python # in terminal 2
  >>> import pvaccess
  >>> srv = pvaccess.RpcServer()
  >>> def echo(x):    # x is an instance of PvObject
  ...     print 'Got object: ', x
  ...     return x    # service must return an instance of PvObject
  >>> srv.registerService('echo', echo)
  >>> srv.listen()
  1. In terminal 1, reuse previous request object
  >>> rpc = pvaccess.RpcClient('echo')
  >>> response = rpc.invoke(request)
  >>> print response
  structure
      string a 11
      string b 22

Example 2

  1. In terminal 2:
  $ python
  >>> import pvaccess
  >>> srv = pvaccess.RpcServer()
  >>> def sum(x):
  ...     a = x.getInt('a')
  ...     b = x.getInt('b')
  ...     return pvaccess.PvInt(a+b)
  >>> srv.registerService('sum', sum)
  >>> srv.listen()
  1. In terminal 1:
  >>> rpc = pvaccess.RpcClient('sum')
  >>> request = pvaccess.PvObject({'a': pvaccess.INT, 'b': pvaccess.INT})
  >>> request.set({'a': 11, 'b': 22})
  >>> print request
  structure
      int a 11
      int b 22
  >>> response = rpc.invoke(request)
  >>> print response
  structure
      int value 33

Example 3

  1. In terminal 2:
  >>> import pvaccess
  >>> srv = pvaccess.RpcServer()
  >>> def hash(x):
  ...     import hashlib
  ...     md5 = hashlib.md5()
  ...     md5.update(str(x))
  ...     h = md5.hexdigest()
  ...     dict = x.getStructureDict()
  ...     dict['hash'] = pvaccess.STRING
  ...     response = pvaccess.PvObject(dict)
  ...     response.setString('hash', h)
  ...     return response
  >>> srv.registerService('hash', hash)
  >>> srv.listen()
  1. In terminal 1:
  >>> rpc = pvaccess.RpcClient('hash')
  >>> request = pvaccess.PvString('abcd')
  >>> print rpc.invoke(request)
  structure
      string hash 0a380e7375d8c3f68d1bbe068141d6ce
      string value

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

pvapy-2.3.0-cp38-cp38-win_amd64.whl (2.4 MB view details)

Uploaded CPython 3.8 Windows x86-64

pvapy-2.3.0-cp38-cp38-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.8

pvapy-2.3.0-cp37-cp37m-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.7m Windows x86-64

pvapy-2.3.0-cp37-cp37m-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.7m

pvapy-2.3.0-cp36-cp36m-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.6m Windows x86-64

pvapy-2.3.0-cp36-cp36m-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.6m

pvapy-2.3.0-cp35-cp35m-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.5m

pvapy-2.3.0-cp34-cp34m-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 3.4m

pvapy-2.3.0-cp27-cp27mu-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 2.7mu

pvapy-2.3.0-cp27-cp27m-manylinux1_x86_64.whl (12.8 MB view details)

Uploaded CPython 2.7m

File details

Details for the file pvapy-2.3.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.4

File hashes

Hashes for pvapy-2.3.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 67b7de4f2b6dc24f3df9e6ea1acbc5077b054627b820e5a12403ece383f2e1bf
MD5 01e6b8b700eeefc673f7fd88976a9c0b
BLAKE2b-256 2d5527de7a84d1d2d5ddf21b9431cf07c6fb0398f967be7044e4cab44ea27d4a

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4777fed2b04bc6f0a1e9c74bf868fc4fefeec58a93858e6c48fca8a5f338a670
MD5 9473556e6e880a82fe7d06d0641705f7
BLAKE2b-256 f25a11d9716caff8a15226a79a41864a11fdf9ef778c0f1db9009ecda10e377b

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.4

File hashes

Hashes for pvapy-2.3.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 acc53c3ac6a12b71f8c2cacbf8c9ea87643d90575997617648cb84d33d5b2964
MD5 5f1e9cb39672b97a3b0cb66ef2ec7f3b
BLAKE2b-256 2ae1db570a9c70511ab564fdeacc2b03bb494eb804a69bd8427b58702261365b

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 98eb2fef1b7d0d983333fee9838a68a4cba602dbe9206d7021f86828f8ceb759
MD5 0b1a5aa7e906f1cae711b75b8787dcab
BLAKE2b-256 f472270e4ac4d28f3fcb500b5b97393e0d4c9b35ad30afaa91ac65848983ffb0

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0.post20200714 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.6.10

File hashes

Hashes for pvapy-2.3.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 470ba3b5ad0081a4779038a821fe36cb4bd1256ec07712be1859b27993788281
MD5 dee9caf57dbb8447590e892138907380
BLAKE2b-256 6854f747c22079e3ad9556f23bed462666439e4270c4aa1f29fbade3d544e4c3

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c8b9dd9d341acc2d7019df4e5b8d605d4960c239125b828e6a446e2001029048
MD5 b1e5a50f38cff507bfc3c168b96121f1
BLAKE2b-256 043c787217160740bba241d7d6b16b5094987aaa5518113345ca0e32d5475628

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2fbbaf36adf3400d1a2227f04ba0ed3ea6caa95afabd08911cc04ee339f371ef
MD5 8866674f9be002675b4bd130c89b1802
BLAKE2b-256 f41d6a1986cedf29d00e73b6f4f1740a71df2280b98875d6ddd9fe7e901cf65f

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp34-cp34m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 3.4m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2b6b3144c2bbb39e2cd8746f4ad2b90b309727967b43104e00ee92a5c752dfd2
MD5 f748316bc0a02eaf983dbccff21f08c4
BLAKE2b-256 cc4d4786b92175d5bf429f2cbb209f5a882c902b2be1f41b3ddf3ee2f8a9d604

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp27-cp27mu-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp27-cp27mu-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 2.7mu
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1f25e66ceaff22814fbf7d6e023a411ca4e8ee3f16300f5fabcf80652ea4c338
MD5 af12a9a63fdb243a90bac421971ea81d
BLAKE2b-256 49e20c8b9b058594d4595db1f0f246f2129185b6493a275942cb35fc64b5e7a2

See more details on using hashes here.

File details

Details for the file pvapy-2.3.0-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

  • Download URL: pvapy-2.3.0-cp27-cp27m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 12.8 MB
  • Tags: CPython 2.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.6

File hashes

Hashes for pvapy-2.3.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cdc6bd50a3b52498853aed0a1c8df57c04a4686c37972a86b0894d59fb05d64b
MD5 042678c0ce7ba00fc47fbe61be06e46b
BLAKE2b-256 47d2a5ba9f2d3e8de69180cefea6c0db2eb9aa47b6a2bdd53e87963a52ecea79

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