pvaPy provides Python bindings for EPICS pvAccess

Overview

PvaPy - PvAccess for Python

The PvaPy package is a Python API for EPICS7. It supports both PVA and CA providers, all standard EPICS7 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 EPICS7 C++ libraries and APIs, and is currently supported on Linux, OSX and Windows.

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

Automated build works under Linux and OSX. 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 (all platforms), or using autoconf (on Linux and OSX).

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_NUMPY_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_NUMPY_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
  PVAPY_CPPFLAGS = -I/usr/include -I/usr/include/python2.7
  PVAPY_LDFLAGS = -L/usr/lib64 -lpython2.7
  PVAPY_SYS_LIBS = boost_python  
  PVA_API_VERSION = 480
  PVA_RPC_API_VERSION = 480
  HAVE_BOOST_NUMPY = 0
  HAVE_BOOST_PYTHON_NUMPY = 0
  PYTHON_VERSION = 2.7
  PVAPY_PYTHON = /bin/python
  PVAPY_PYTHONPATH = /home/epics/v4/pvaPy/lib/python/2.7/linux-x86_64
  PVAPY_LD_LIBRARY_PATH = /usr/lib64
  PVAPY_EPICS_BASE = /home/epics/base-3.15.5
  PVAPY_EPICS4_DIR = /home/epics/v4
  PVAPY_HOST_ARCH = linux-x86_64
  PVAPY_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
Comments
  • Shared library issue on OSX

    Shared library issue on OSX

    The shared library pvaccess.dylib does not work on OSX Yosemite(not sure about other OSX versions but we tested on 4 different machines). The issue goes away if .dylib -> .so linked manually.

    opened by arkilic 17
  • NtScalar give segfault with numpy 1.21.0

    NtScalar give segfault with numpy 1.21.0

    I just had issues with segfault when using pvapy. In the end (i hope) it turned out that in the installation of pvapy it also installs numpy 1.21.0 and it seem that that version causes a seg fault at least when trying to creeate a pvaccess.NtScalar object. By reinstalling numpy version 1.20.3 i do not get this issue.

    opened by Anderspp 13
  • PyPI: pvaPy on Raspberry Pi

    PyPI: pvaPy on Raspberry Pi

    Hi, I am unable to get pvaPy from the PyPI repository for my Raspberry Pi. It would be great if wheel for the Raspberry/ARM are available on PyPI. Till then I may have to do a manual compile and install.

    Thank you in advance Kuldeep

    opened by joshikk 11
  • Segmentation Fault

    Segmentation Fault

    Recently when working with PvaPy I have been getting a Segmentation Fault when trying to create a PV.

    I have been working with EPICS version R7.0.5 and pvapy version 3.1.0.

    The simplest case where the fault occurs is when running:

    from pvaccess import NtScalar, INT
    pv = NtScalar(INT)
    

    The backtrace for the above program is:

    (gdb) bt
    #0  0x00007f7a28e8d2f9 in PyDict_GetItemWithError () from /lib64/libpython3.8.so.1.0
    #1  0x00007f7a23ac20bc in PyArray_GetCastingImpl ()
       from /usr/local/lib64/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so
    #2  0x00007f7a23ac2d88 in PyArray_GetCastSafety ()
       from /usr/local/lib64/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so
    #3  0x00007f7a23b71765 in PyArray_EquivTypes ()
       from /usr/local/lib64/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so
    #4  0x00007f7a260c19fa in boost::python::numpy::equivalent(boost::python::numpy::dtype const&, boost::python::numpy::dtype const&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_numpy38.so.1.72.0
    #5  0x00007f7a260c230c in ?? () from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_numpy38.so.1.72.0
    #6  0x00007f7a262e01ce in boost::python::converter::rvalue_from_python_stage1(_object*, boost::python::converter::registration const&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #7  0x00007f7a2789c8ab in PyPvDataUtility::updateFieldArrayFromInt(boost::python::api::object const&, std::string const&, std::vector<std::tr1::shared_ptr<epics::pvData::Field const>, std::allocator<std::tr1::shared_ptr<epics::pvData::Field const> > >&, std::vector<std::string, std::allocator<std::string> >&) () from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #8  0x00007f7a278a0e44 in PyPvDataUtility::updateFieldArrayFromDict(boost::python::dict const&, std::vector<std::tr1::shared_ptr<epics::pvData::Field const>, std::allocator<std::tr1::shared_ptr<epics::pvData::Field const> > >&, std::vector<std::string, std::allocator<std::string> >&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #9  0x00007f7a278a12e0 in PyPvDataUtility::createStructureFromDict(boost::python::dict const&, std::string const&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #10 0x00007f7a2787e867 in PvObject::PvObject(boost::python::dict const&, std::string const&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #11 0x00007f7a2786db59 in NtType::NtType(boost::python::dict const&, std::string const&) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #12 0x00007f7a278693fa in NtScalar::NtScalar(PvType::ScalarType) () from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    --Type <RET> for more, q to quit, c to continue without paging--
    #13 0x00007f7a27822f5c in boost::python::objects::make_holder<1>::apply<boost::python::objects::value_holder<NtScalar>, boost::mpl::vector1<PvType::ScalarType> >::execute(_object*, PvType::ScalarType) () from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #14 0x00007f7a27800aeb in boost::python::objects::caller_py_function_impl<boost::python::detail::caller<void (*)(_object*, PvType::ScalarType), boost::python::default_call_policies, boost::mpl::vector3<void, _object*, PvType::ScalarType> > >::operator()(_object*, _object*) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #15 0x00007f7a262e9611 in boost::python::objects::function::call(_object*, _object*) const ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #16 0x00007f7a262e9958 in ?? () from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #17 0x00007f7a262f21f3 in boost::python::detail::exception_handler::operator()(boost::function0<void> const&) const ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #18 0x00007f7a277d4193 in boost::detail::function::function_obj_invoker2<boost::_bi::bind_t<bool, boost::python::detail::translate_exception<PvaException, void (*)(PvaException const&)>, boost::_bi::list3<boost::arg<1>, boost::arg<2>, boost::_bi::value<void (*)(PvaException const&)> > >, bool, boost::python::detail::exception_handler const&, boost::function0<void> const&>::invoke(boost::detail::function::function_buffer&, boost::python::detail::exception_handler const&, boost::function0<void> const&) () from /usr/local/lib64/python3.8/site-packages/pvaccess/pvaccess.so
    #19 0x00007f7a262f1fcd in boost::python::handle_exception_impl(boost::function0<void>) ()
       from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #20 0x00007f7a262e6c63 in ?? () from /usr/local/lib64/python3.8/site-packages/pvaccess/lib/linux-x86_64/libboost_python38.so.1.72.0
    #21 0x00007f7a28e80f72 in _PyObject_MakeTpCall () from /lib64/libpython3.8.so.1.0
    #22 0x00007f7a28e274c9 in method_vectorcall.cold () from /lib64/libpython3.8.so.1.0
    #23 0x00007f7a28e8bc3f in PyObject_Call () from /lib64/libpython3.8.so.1.0
    #24 0x00007f7a28f24225 in slot_tp_init () from /lib64/libpython3.8.so.1.0
    #25 0x00007f7a28e80e0a in _PyObject_MakeTpCall () from /lib64/libpython3.8.so.1.0
    #26 0x00007f7a28f3bb97 in _PyEval_EvalFrameDefault () from /lib64/libpython3.8.so.1.0
    #27 0x00007f7a28efdf67 in _PyEval_EvalCodeWithName () from /lib64/libpython3.8.so.1.0
    #28 0x00007f7a28eff143 in PyEval_EvalCode () from /lib64/libpython3.8.so.1.0
    --Type <RET> for more, q to quit, c to continue without paging--
    #29 0x00007f7a28f9462a in run_eval_code_obj () from /lib64/libpython3.8.so.1.0
    #30 0x00007f7a28fa6d92 in run_mod () from /lib64/libpython3.8.so.1.0
    #31 0x00007f7a28e58cf0 in PyRun_FileExFlags () from /lib64/libpython3.8.so.1.0
    #32 0x00007f7a28e5fa07 in PyRun_SimpleFileExFlags () from /lib64/libpython3.8.so.1.0
    #33 0x00007f7a28fa895f in Py_RunMain () from /lib64/libpython3.8.so.1.0
    #34 0x00007f7a28fa8ae9 in Py_BytesMain () from /lib64/libpython3.8.so.1.0
    #35 0x00007f7a27de1493 in __libc_start_main () from /lib64/libc.so.6
    #36 0x000055f680b3b78e in _start ()
    
    opened by kathryn-baker 11
  • Requested provider '<all>' not found

    Requested provider '' not found

    Hi,

    I am trying to run the examples described at the README file but I am facing the following issue:

    (py36) [email protected]:~/sandbox/ $ ipython
    Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:14:59)
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: from pvaccess import *
    
    In [2]: pv = PvObject({'x': INT, 'y': INT})
    
    In [3]: pvaServer = PvaServer('pair', pv)
    2018-03-13T11:21:58.977 Requested provider '<all>' not found
    2018-03-13T11:21:58.977 ServerContext configured with not Providers will do nothing!
    
    VERSION : pvAccess Server v6.0.1-SNAPSHOT
    PROVIDER_NAMES :
    BEACON_ADDR_LIST :
    AUTO_BEACON_ADDR_LIST : 1
    BEACON_PERIOD : 15
    BROADCAST_PORT : 5076
    SERVER_PORT : 5075
    RCV_BUFFER_SIZE : 16384
    IGNORE_ADDR_LIST:
    INTF_ADDR_LIST : 0.0.0.0
    

    Here are some information about versions:

    • python: 3.6.2
    • boost: 1.66.0
    • epics base: R7.0.1.1-50-gd0a5a985f
      • pvAccess: 6.0.0-56-g74fbd22d4
      • pvDatabase: 4.3.0-5-g83101e210
      • pvaClient: 4.3.0-9-g4e4554af4
      • pvData: 7.0.0-19-gf2ad6292f
      • pva2pva: 1.0.0-15-g272b4fb9c
    • pvaPy: 1.0.0-53-g5db28b0
    opened by hhslepicka 10
  • Question about sub-field ordering

    Question about sub-field ordering

    The Normative Types spec says the order of fields matters and must be preserved. This is necessary for NTTable, but (looking at the pvaPy documentation) the column spec gets passed into the PVObject structure using a regular python dictionary, which AIUI doesn't preserve that order. Is this reasoning correct, or is there something else that we haven't understood?

    opened by anjohnson 10
  • Remove code for building against 4.3 and unused function parameter

    Remove code for building against 4.3 and unused function parameter

    I've removed code for building against the EPICS 4.3.0.

    This code was conditionally compiled using the preprocessor macro PVA_API_VERSION. The code no longer builds against 4.3.0 since the addition of unions, the 4.3.0 API is now very old, both for pvData and pvAccess, and now that the PVStructure::get*Field functions deprecated since 4.4 have been removed it would be burdensome to make it build against 4.3.0 again.

    I've also removed the code for conditionally compiling against old version of the RPC API. PVA_API_VERSION as these will only be applicable for building against pre-4.4.0 versions.Specifically the code conditionally-compiled when the PVA_API_RPC_VERSION is 430 or 435.

    With the get*Field operations removed pyListToScalarArrayField no longer need the scalarType parameter. I kept this because the 4.3 version of the code was using it, but with the 4.3 code it can go.

    opened by dhickin 7
  • Access security

    Access security

    Is it possible to enable access security using these python bindings?

    I wondered if there was an equivalent to doing something like the file based definitions (below) using pvapy.

    UAG(uag) {user1,user2}
    HAG(hag) {host1,host2}
    ASG(DEFAULT) {
        RULE(1,READ)
        RULE(1,WRITE) {
            UAG(uag)
            HAG(hag)
        }
    }
    
    opened by thomasms 6
  • Problem building documentation on RHEL7

    Problem building documentation on RHEL7

    pvaPy 2.0.0 Base (C++) 7.0.3.1 Python 2.7

    On RHEL7, the sphinx_rtd_theme can be installed from EPEL as python2-sphinx_rtd_theme-0.2.4-3.el7.noarch.rpm. (This pulls a few dependencies for the fonts.)

    After that, the pvaPy documentation build still fails with:

    make[1]: Entering directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation'
    . /home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/bin/linux-x86_64/pvapy_setup_full.2.7.sh; make -C sphinx default
    make[2]: Entering directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation/sphinx'
    export PATH=`dirname /usr/bin/sphinx-build`:/usr/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/DCS/langer/bin && make -f Makefile.sphinx html
    make[3]: Entering directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation/sphinx'
    sphinx-build -b html -d _build/doctrees   . _build/html
    Running Sphinx v1.1.3
    loading pickled environment... not yet created
    [ERROR] Theme error:
    [WARN] no theme named 'sphinx_rtd_theme' found (missing theme.conf?)
    [WARN] make[3]: *** [html] Error 1
    make[3]: Leaving directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation/sphinx'
    make[2]: Leaving directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation/sphinx'
    make[1]: Leaving directory `/home/DCS/langer/work/CODAC/m-python-pvapy/target/pvaPy-2.0.0/documentation'
    [WARN] make[2]: *** [html] Error 2
    [WARN] make[1]: *** [default] Error 2
    [WARN] make: *** [doc] Error 2
    

    What am I missing?

    opened by ralphlange 6
  • FIX: Changing Python version comparison from StrictVersion to LooseVersion

    FIX: Changing Python version comparison from StrictVersion to LooseVersion

    Due to some bugs with weird Python versions, e.g. 2.7.12+.

    As reported by @arkilic, see https://gist.github.com/arkilic/77443a88a77abce029064c6cc21ca828, after the changes he faced an error when compiling pvaPy under system python in ubuntu 16.04 LTS.

    @arkilic, please test again with your system that was presenting the error. I did some tests and it works for me here.

    opened by hhslepicka 6
  • putScalarArray fails for numbers > 6 digits

    putScalarArray fails for numbers > 6 digits

    Hi. I am unable to put an array where any value contains a string longer than 6 digits using the method Channel::putScalarArray. However, pvput works fine on the command line.

    I also tried constructing a PvScalarArray of type ULONG, but a pvaccess.PvScalarArray is not accepted by Channel::putScalarArray.

    Below are the database I used and the commands which can be run to reproduce the error. I am using pvapy 2.2

    (dgro_asub) j[email protected]:dgro_asub$ pip freeze | grep pvapy
    pvapy==2.2.0
    
    record(waveform, "Addresses")
    {
        field(DESC, "Addresses")
        field(FTVL, "ULONG")
        field(NELM, "3")
    }
    
    In [1]: import pvaccess                                                                              
    
    In [2]: c = pvaccess.Channel("Addresses")                                                            
    
    In [3]: print(c.get())                                                                               
    epics:nt/NTScalarArray:1.0 
        uint[] value [123456]
        alarm_t alarm
            int severity 0
            int status 0
            string message NO_ALARM
        time_t timeStamp
            long secondsPastEpoch 1591882692
            int nanoseconds 459499857
            int userTag 0
        structure display
            double limitLow 0
            double limitHigh 0
            string description Addresses
            string units 
            int precision 0
            enum_t form
                int index 0
                string[] choices ["Default", "String", "Binary", "Decimal", "Hex", "Exponential", "Engineering"]
        control_t control
            double limitLow 0
            double limitHigh 0
            double minStep 0
        valueAlarm_t valueAlarm
            boolean active false
            double lowAlarmLimit nan
            double lowWarningLimit nan
            double highWarningLimit nan
            double highAlarmLimit nan
            int lowAlarmSeverity 0
            int lowWarningSeverity 0
            int highWarningSeverity 0
            int highAlarmSeverity 0
            byte hysteresis 0
    
    
    In [4]: c.putScalarArray([123456])                                                                   
    
    In [5]: c.get()["value"]                                                                             
    Out[5]: array([123456], dtype=uint32)
    
    In [6]: c.putScalarArray([1234567])                                                                  
    ---------------------------------------------------------------------------
    PvaException                              Traceback (most recent call last)
    <ipython-input-6-4152885d1ebd> in <module>
    ----> 1 c.putScalarArray([1234567])
    
    PvaException: parseToPOD: Extraneous characters
    
    In [7]: quit()         
                                                                                  
    (dgro_asub) [email protected]:dgro_asub$ pvput Addresses [1234567]
    Old : 2020-06-11 15:39:19.060  [123456]
    New : 2020-06-11 15:43:26.610  [1234567]
    
    opened by jsparger 5
  • Possibility of supporting epicscorelibs for PyPI uploaded wheels

    Possibility of supporting epicscorelibs for PyPI uploaded wheels

    We're in the process of writing Ophyd.v2: https://github.com/bluesky/ophyd/pull/1078

    The main aims are:

    • Write Devices using asyncio logic
    • Allow use of both CA and PVA in the same process
    • Allow use of Ophyd.v1 and Ophyd.v2 in the same process

    This gives me a bit of an issue. For asyncio compatible CA, I use aioca, which loads the libCom provided by epicscorelibs using ctypes. I can make the pyepics used by Ophyd.v1 use the same libCom with an environment variable. I can also use p4p (which is asyncio compatible) as it is compiled against epicscorelibs, but I can't use pvaPy because it bundles and compiles against its own libCom and friends. I can run pvaPy in a threadpool to make it asyncio compatible, although if you have plans to support asyncio natively that would be even better.

    Would it be possible to make pvaPy compile against epicscorelibs when uploading to PyPI? Happy to have a zoom on this topic if this is helpful.

    opened by coretl 2
  • Best method for handling reconnections to large numbers of PVs

    Best method for handling reconnections to large numbers of PVs

    Hello,

    In our group we are using pvapy for a number of applications but primarily to host a number of PvaServers. We then have a separate application that connects to the PVs on these servers using the Channel client to monitor them for changes.

    So far, the functionality of both applications has worked well, but we are now facing a number of issues with reconnection protocols. I have tried two different methods to account for PV reconnections so far and both have created their own problems. I'm not sure if these are a result of how I'm doing the reconnection using the library or something in our system...

    The methods I've tested so far are:

    1. I create the Channel object for the client, if the PV is down and it times out, we subscribe the onChanges function to monitor for updates anyway and just wait for the channel to connect and start receiving messages at some point in the future

    This method works well if the PvaServer is stopped cleanly, but encounters problems if the PvaServer crashes unexpectedly. In this case we stop receiving updates for the PVs through the assigned onChanges function, even though we can see the PVs updating with a pvmonitor on the command line.

    1. I create the Channel object for the client and assign a connection callback using the setConnectionCallback() method. In this method we subscribe the onChanges function and start monitoring the PV. When it disconnects, we stop monitoring the channel.

    This second option feels to me to be the cleaner of the two. However, we noticed alternating crashes between the PvaServer and the client application. We haven't yet worked out which of the two programs is responsible for the crashes. We also encountered some segmentation faults using this method.

    In your opinion, what is the best way to handle these situations where potentially lots of PVs become disconnected at once? Do you have any advice for how to handle reconnections on the client side, and is there anything you might be able to suggest for the server side to improve the closure of PV connections?

    Thanks for your help!

    opened by kathryn-baker 7
  • Review performance testing

    Review performance testing

    Hello, I've written a small Python module https://github.com/ajgdls/EPICSPyClientPerformance to compare the performance of 6 Python based EPICS clients. I have attempted to test each in a consistent way, and the README has some preliminary results for monitoring 1000 records at 10Hz for 1000 samples.

    I would really appreciate it if this module owner would review EPICSPyClientPerformance test code for this client implementation to check that I'm actually testing in the correct and most efficient way. I would be happy to make updates that shows an increase in performance for this client.

    This testing is driven by Diamond Light Source, and on 1st December the tests will be re-run against latest PyPI versions and then published (probably tech-talk) for further discussion, so if anyone wants to push performance optimisations they will get picked up on that date.

    Thanks for taking a look, looking forward to hearing from everyone.

    opened by ajgdls 10
  • Mirror server slow processing large struct arrays

    Mirror server slow processing large struct arrays

    Problem: PV servers has difficultly keeping up reading PV objects with very large struct arrays. The same issue appears with both mirror server and p2p. Steps to reproduce:

    1. IOC is writing PV array with 27000 struct elements to a PV channel at 10hz
    2. Run mirror server mapped to PV channel to a second PV channel
    3. Run pvapy client to read data from the second PV channel

    The pvapy client receives the data at 4Hz. The TCP-rx thread in the mirror server is maxed out and the perf profile shows that it is spending most time creating and deleting struct arrays (see graph below):

    image

    Both the mirror server and pv client can be optimized by caching the PV object structure after the connection is initialized.

    opened by echandler-anl 0
  • submit package to conda-forge

    submit package to conda-forge

    epics-base 7.0.3.1 is now available on conda-forge. I think it'd make sense to have pvaPy there as well. It would ensure it's built with compatible versions of numpy and boost. I have a repo ready: https://github.com/beenje/staged-recipes/tree/pvapy/recipes/pvaPy

    I'd like your approval before to submit it to conda-forge of course. And would other contributors be interested to be added as maintainer?

    opened by beenje 0
  • autoconf failure with INSTALL_LOCATION=

    autoconf failure with INSTALL_LOCATION=

    Trying to configure pvaPy with INSTALL_LOCATION given

    tar -xaf EPICS-CPP-4.6.0.tar.gz
    cd EPICS-CPP-4.6.0/
    make -j4 EPICS_BASE=/home/mdavidsaver/work/epics/base-git INSTALL_LOCATION=$PWD/root
    make -j4  EPICS_BASE=/home/mdavidsaver/work/epics/base-git INSTALL_LOCATION=$PWD/root config.pvaPy
    make -j4  EPICS_BASE=/home/mdavidsaver/work/epics/base-git INSTALL_LOCATION=$PWD/root pvaPy
    
    checking for boostlib >= 1.40... yes
    configure: Using boost version 105500
    checking whether the Boost::Python library is available... yes
    checking for exit in -lboost_python... yes
    checking for Boost.NumPy library... no
    checking how to run the C++ preprocessor... g++ -E
    checking for EPICS base directory /home/mdavidsaver/work/epics/base-git... yes
    checking for EPICS Base version >= 3.14.12... yes
    checking for EPICS Base libraries for linux-x86_64... yes
    checking for EPICS4 directory /home/mdavidsaver/work/epics/EPICS-CPP-4.6.0... no
    configure: error: "could not find pvAccess installation: no header file /home/mdavidsaver/work/epics/base-git/include/epicsVersion.h"
    Makefile:46: recipe for target 'configure' failed
    make[1]: *** [configure] Error 1
    make[1]: Leaving directory '/home/mdavidsaver/work/epics/EPICS-CPP-4.6.0/pvaPy'
    Makefile:140: recipe for target 'pvaPy/configure/RELEASE.local' failed
    make: *** [pvaPy/configure/RELEASE.local] Error 2
    

    The epicsVersion.h header does exist at the location mentioned

    $ ls /home/mdavidsaver/work/epics/base-git/include/epicsVersion.h
    /home/mdavidsaver/work/epics/base-git/include/epicsVersion.h
    
    opened by mdavidsaver 3
Releases(5.2.0)
  • 5.2.0(Nov 4, 2022)

    • Streaming Framework enhancements:
      • enabled format specifier for id replacements in channel names for both pvapy-hpc-consumer and pvapy-hpc-collector command line interfaces
      • added ability to specify arbitrary consumer id list for the pvapy-hpc-consumer command line interface
      • updated user processor interface for creating output record so that it can use input channel object
    • Conda/pip package dependencies:
      • EPICS BASE = 7.0.7
      • BOOST = 1.78.0
      • NUMPY >= 1.22 (for python >= 3.8); >= 1.19, < 1.21 (for python < 3.8)
    Source code(tar.gz)
    Source code(zip)
  • 5.1.2(Oct 22, 2022)

    • Packaging changes: streaming framework dependencies are optional
    • Conda/pip package dependencies:
      • EPICS BASE = 7.0.7
      • BOOST = 1.78.0
      • NUMPY >= 1.22 (for python >= 3.8); >= 1.19, < 1.21 (for python < 3.8)
    Source code(tar.gz)
    Source code(zip)
  • 5.1.1(Oct 19, 2022)

    • Streaming framework fixes for windows
    • Conda/pip package dependencies:
      • EPICS BASE = 7.0.7
      • BOOST = 1.78.0
      • NUMPY >= 1.22 (for python >= 3.8); >= 1.19, < 1.21 (for python < 3.8)
    Source code(tar.gz)
    Source code(zip)
  • 5.1.0(Oct 14, 2022)

    • Resolved dependency issues with the curses library
    • Implemented CaIoc class that has ability to run basic CA IOC and provides interfaces for loading databases, as well as loading, retrieving and updating records
    • PvaServer enhancements:
      • callback thread is not started until database records require it
    • Area Detector Simulator enhancements:
      • added ability to generate and publish image metadata, either as CA or as PVA channels
    • Streaming Framework enhancements:
      • implemented ability to receive CA and PVA metadata in both data collector and data consumer, and to process those together with the data objects
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.7
      • BOOST = 1.78.0
      • NUMPY >= 1.22 (for python >= 3.8); < 1.21 (for python < 3.8)
    Source code(tar.gz)
    Source code(zip)
  • 5.0.0(Aug 11, 2022)

    • PvaMirrorServer enhancements:
      • optimized structure copy on processing
      • added ability to specify source server queue size
      • added ability to retrieve mirror record statistics
    • Channel enhancements:
      • added monitoring methods that push PV updates into the PvObject queue and allow python processing to be done elsewhere
      • added ability to retrieve channel monitor statistics
    • PvTimeStamp enhancements:
      • added constructor from and conversion to float
      • added python properties for all fields
    • NtNdArray enhancements:
      • updated structure IDs for NtAttribute
      • added support for pickling NtNdArray objects
    • NtTable enhancements:
      • updated structure IDs
    • PvObject enhancements:
      • simplified handling of unions
    • Area Detector Simulator enhancements:
      • option to generate frames with different data types and in the specified ranges
      • option to use numpy memory map for loading input files
      • option to notify channel access PV when server starts
    • added python HPC Streaming Framework for processing data produced at high rates using stream consumers and stream collectors (see the framework documentation); the frameworks requires python >= 3.7; new command line utilities:
      • pvapy-hpc-consumer
      • pvapy-hpc-collector
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6.1.C2.3
      • BOOST = 1.78.0
      • NUMPY >= 1.22 (for python >= 3.8); < 1.21 (for python < 3.8)
    Source code(tar.gz)
    Source code(zip)
  • 4.2.0(Jun 7, 2022)

    • added support for NtEnum
    • updated structure IDs for NtScalar fields
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6.1
      • BOOST = 1.78.0
      • NUMPY >= 1.22
    Source code(tar.gz)
    Source code(zip)
  • 4.1.1(Mar 23, 2022)

    • added pip support for OSX and ARM64
    • enabled assigning IDs for structure fields
    • updated NtNdArray object with IDs for structure fields to make it compatible with standard normative type
    • improved frame rate accuracy for area detector simulator
    • added ability to read image data from a given folder
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6.1
      • BOOST = 1.78.0
      • NUMPY >= 1.22
    Source code(tar.gz)
    Source code(zip)
  • 4.1.0(Jan 26, 2022)

    • introduced PVA server mirror class
    • added distributor plugin for the PVA server
    • restricted numpy version to >= 1.22, as these versions resolve issues with boost python segfaults
    • introduced PVAPY_EPICS_LOG_LEVEL environment variable to control logging in the epics PVA libraries; allowed log levels correspond to pvAccess library logger: 0 (all messages) to 7 (no messages; default)
    • added command line utilities:
      • pvapy-mirror-server
      • pvapy-ad-sim-detector
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6.1
      • BOOST = 1.78.0
      • NUMPY >= 1.22
    Source code(tar.gz)
    Source code(zip)
  • 4.0.3(Sep 23, 2021)

    • added isConnected() method to the Channel class
    • introduced semi-permanent threads for asyncGet/asyncPut interfaces
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6
      • BOOST = 1.72.0
      • NUMPY < 1.21
    Source code(tar.gz)
    Source code(zip)
  • 4.0.2(Sep 14, 2021)

    • fixed decoding error for strings that cannot be handled with utf-8 codec
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6
      • BOOST = 1.72.0
      • NUMPY < 1.21
    Source code(tar.gz)
    Source code(zip)
  • 4.0.1(Sep 14, 2021)

    • updated asyncGet/asyncPut interfaces to allow exception callbacks, and fixed async connection issue (GitHub Issue #68, PR #69)
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6
      • BOOST = 1.72.0
      • NUMPY < 1.21
    Source code(tar.gz)
    Source code(zip)
  • 4.0.0(Sep 14, 2021)

    • disabled info printout for PvaServer unless the debug log level is set to INFO (8) or DEBUG (16)
    • fixed issue with channel puts involving objects like PvTimeStamp or PvAlarm (GitHub Issue #65, PR #66)
    • made performance enhancements for channel gets and puts in multithreaded applications
    • added asyncGet/asyncPut interfaces to the Channel class
    • restricted numpy version to < 1.21 for conda and pip packages until boost python segfaults are resolved
    • added support for access security in the PvaServer class
    • fixed issue with timestamp processing in the PyPvRecord class
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.6
      • BOOST = 1.72.0
      • NUMPY < 1.21
    Source code(tar.gz)
    Source code(zip)
  • 3.1.0(Feb 16, 2021)

    • added support for MultiChannel put and monitor
    • added PvValueAlarm, PvControl, and NtScalar wrapper classes
    • fixed numpy initialization problem
    • added error handling to RpcServer class
    • added copy method to PvObject class
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.4.1
      • BOOST = 1.72.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Aug 18, 2020)

    • added support for windows
    • added ability to retrieve PvObject field as a string
    • added NtNdArray and its related wrapper classes
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.4
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Jun 15, 2020)

    • fixed issue with channel puts involving large integers (GitHub Issue #58)
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.4
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Apr 24, 2020)

  • 2.1.0(Jan 20, 2020)

    • added JSON support from pvaClientCPP (GitHub PR #52)
    • fixed documentation build for older sphinx versions
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.3.1
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Jan 20, 2020)

  • 2.0.0(Aug 12, 2019)

    • added MultiChannel class, which allows simultaneous retrieval of PV data from multiple channels
    • added getName() method to the Channel class python interface
    • fixed RPC request timeout issue when both RpcClient and RpcServer instances use the same interpreter (GitHub PR #50)
    • fixed PvaServer issue with removal of connected records (GitHub Issue #49, PR #51)
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.3
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 1.6.0(May 11, 2019)

    • added ability to set structure fields using PvObjects
    • fixed issue with setting variant unions using PvObjects
    • added automated tests to conda packaging
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.2.2
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Apr 25, 2019)

    • added dictionary methods to PvObject class: items(), keys(), values()
    • fixed build warning for multiple inclusion of build rules
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.2.2
      • BOOST = 1.70.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Mar 29, 2019)

    • added method for removing all records from PvaServer
    • added start/stop methods for PvaServer
    • resolved issue with PvaServer record write callbacks hanging if both client and server are running in the same interpreter
    • added support for building local installation of epics/boost/pvapy
    • resolved several issues with pip packaging
    • conda/pip package dependencies:
      • EPICS BASE = 7.0.2.1
      • BOOST = 1.69.0
      • NUMPY > 1.15
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Jan 30, 2019)

    • fixed build issues related to EpicsHostArch script location
    • updated code to reflect changes in CA provider
    • updated conda build scripts for EPICS 7.0.2
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Jul 11, 2018)

    • added ability to set numeric scalar arrays using NumPy arrays directly
    • fixed issue with building documentation when multiple versions of python are present
    • introduced support for building pvapy pip packages
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Apr 30, 2018)

    • added introspection interface to Channel class
    • fixed configuration issue for OSX
    • introduced support for building pvapy conda packages
    • replaced old (c)sh setup files with new PYTHONPATH-only and and full (PATH, PYTHONPATH, LD_LIBRARY_PATH) file
    • updated doc build so that it uses information in CONFIG_SITE.local; users are no longer required to configure python-related variables before building documentation
    • fixed issue with accessing NumPy arrays from temporary objects
    • fixed issue with RPC service segfaulting while returning result
    • fixed issue with RPC service non-interactive mode (listen() method call)
    • added version string to the pvaccess module
    • added ability to specify timeout for RPC client
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jan 4, 2018)

  • 0.9.0(Sep 18, 2017)

    • improved support for channel monitors: no monitor startup thread results in faster initial connections; monitors connect automatically when channels come online
    • fixed support for older EPICS v4 releases (4.4, 4.5 and 4.6)
    • added build support for numpy included with boost releases 1.63.0 and later
    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(Jul 17, 2017)

    • added new Channel monitor() method that can be used instead of subscribe()/startMonitor() sequence in case when there is only one subscriber
    • enhanced PvaServer functionality: single server instance can serve multiple channels; channels can be added and removed dynamically; added (optional) callback for channel writes
    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(May 10, 2017)

    • added initial version of PvaServer class: PvObject exposed via instance of this class can be retrieved and manipulated using standard PVA command line tools and APIs
    • fixed boolean array conversion to python list
    • improved support for builds relying on custom boost installation
    Source code(tar.gz)
    Source code(zip)
Owner
EPICS Base
Projects maintained by the EPICS Core Developers group
EPICS Base
"Cambio de monedas" Change-making problem with Python, dynamic programming best solutions,

Change-making-problem / Cambio de monedas Entendiendo el problema Dada una cantidad de dinero y una lista de denominaciones de monedas, encontrar el n

Juan Antonio Ayola Cortes 1 Dec 08, 2021
Read and write life sciences file formats

Python-bioformats is a Python wrapper for Bio-Formats, a standalone Java library for reading and writing life sciences image file formats. Bio-Formats

CellProfiler 106 Dec 19, 2022
Sheet2export - FreeCAD macro to export spreadsheet

Description This is FreeCAD macro to export spreadsheet to file.

Darek L 3 Jul 09, 2022
Parser for the GeoSuite[tm] PRV export format

Parser for the GeoSuite[tm] PRV export format This library provides functionality to parse geotechnical investigation data in .prv files generated by

EMerald Geomodelling 1 Dec 17, 2021
Customisable coding font with alternates, ligatures and contextual positioning

Guide Ligature Support Links Log License Guide Live Preview + Download larsenwork.com/monoid Install Quit your editor/program. Unzip and open the fold

Andreas Larsen 7.6k Dec 30, 2022
[Cython] Vs [Python] Which one is Faster ?

[Cython] Vs [Python] ? Attractive Contrast :) Mission : Which one is Faster ? Comparing of Execution runtime for [Selection_sort] with Time Complexity

baqer marani 1 Dec 05, 2021
Slotscheck - Find mistakes in your slots definitions

🎰 Slotscheck Adding __slots__ to a class in Python is a great way to reduce mem

Arie Bovenberg 67 Dec 31, 2022
Calculate the efficient frontier

关于 代码主要参考Fábio Neves的文章,你可以在他的文章中找到一些细节性的解释

Wyman Lin 104 Nov 11, 2022
Pomodoro timer by the Algodrip team!

PomoDrip 🍅 Pomodoro timer by the Algo Drip team! To-do: Create the script for the pomodoro timer Design the front-end of the program (Flask or Javasc

Algodrip 3 Sep 12, 2021
Coffeematcher is a python library to randomly match participants for coffee meetings.

coffeematcher coffeematcher is a python library to randomly match participants for coffee meetings. Installation Clone the repository: git clone https

Thomas Wesselink 3 May 06, 2022
Awesome Casino is simple offline casino made on python.

Awesome-Casino Awesome Casino is simple offline casino made on python. I found bug, what can i do? If you find any bug or want to suggest any idea, al

Herman 1 Feb 04, 2022
Tiling manager which runs on top of EWMH window managers.

PyTyle is an extremely versatile and extensible tiling manager that is meant to be used on top of EWMH window managers. Its feature set was modeled af

55 Jul 29, 2021
Make your Discord Account Online 24/7!

Online-Forever Make your Discord Account Online 24/7! A Code written in Python that helps you to keep your account 24/7. The main.py is the main file.

SealedSaucer 0 Mar 16, 2022
Design-by-contract in Python3 with informative violation messages and inheritance

icontract icontract provides design-by-contract to Python3 with informative violation messages and inheritance. It also gives a base for a flourishing

275 Jan 02, 2023
A weekly dive into commonly used modules in the Rust ecosystem, with story flavor!

The goal of this project is to bring the same concept as PyMOTW to the Rust world. PyMOTW was an invaluable resource for me when I was learning Python years ago, and I hope that I can help someone in

Scott Lyons 20 Aug 26, 2022
Additional useful operations for Python

Pyteal Extensions Additional useful operations for Python Available Operations MulDiv64: calculate m1*m2/d with no overflow on multiplication (TEAL 3+

Ulam Labs 11 Dec 14, 2022
Force you (or your user) annotate Python function type hints.

Must-typing Force you (or your user) annotate function type hints. Notice: It's more like a joke, use it carefully. If you call must_typing in your mo

Konge 13 Feb 19, 2022
Github Star Tracking app with Streamlit

github-star-tracking-python-app Github Star Tracking app with Streamlit #8daysofstreamlit How to run it locally? Clone or Download & Unzip the Repo En

amrrs 4 Sep 22, 2022
Wrapper around anjlab's Android In-app Billing Version 3 to be used in Kivy apps

IABwrapper Wrapper around anjlab's Android In-app Billing Version 3 to be used in Kivy apps Install pip install iabwrapper Important ( Add these into

Shashi Ranjan 8 May 23, 2022
GUI for the Gammu library.

Wammu GUI for the Gammu library. Homepage https://wammu.eu/ License GNU GPL version 3 or later. First start On first start you will be asked for set

Gammu 60 Dec 14, 2022