StreamingPrices does not update when open() is not called infront of it every time.

Hello,

>>> rdp.__version__
'1.0.0a12'


I am bit confused about the lack of updates on rdp.StreamingPrices when the function is.open() is not used every time in front of get_snapshot. In the end I want to make this data available to my application and not to read it from the console. Is this normal behavior. Normally with stream state open I would expect that a snapshot delivers the actual value every time and not a valid from 5 minutes ago.

What is the best way to deal with this issue?


case1: Is.open is only used 1x and data is apparently flowing in according to print statement. Here is valid that no update on get_snapshot can be observed:

>>> def display_fields(streaming_prices, instrument_name, fields):
... print("Fields received for", instrument_name, ":", fields)
...
>>> streaming_prices = rdp.StreamingPrices(
... universe = ['EUR=','GBP=','JPY=', 'CAD='],
... fields = ['SALTIM', 'CF_BID','CF_ASK','OPEN_PRC', 'CF_HIGH','CF_LOW', 'CF_CLOSE'],
... on_refresh = lambda streaming_prices, instrument_name, fields :
... display_fields(streaming_prices, instrument_name, fields),
... on_update = lambda streaming_prices, instrument_name, fields :
... display_fields(streaming_prices, instrument_name, fields)
... )
>>> streaming_prices.open()
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1132, 'OPEN_PRC': 1.1144, 'CF_HIGH': 1.1155, 'CF_LOW': 1.1122, 'CF_CLOSE': 1.1143}
Fields received for EUR= : {'CF_BID': 1.113, 'CF_ASK': 1.1134}
Fields received for EUR= : {'CF_BID': 1.1129, 'CF_ASK': 1.1133}
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1132}
Fields received for GBP= : {'CF_BID': 1.3387, 'CF_ASK': 1.3391, 'OPEN_PRC': 1.3378, 'CF_HIGH': 1.3415, 'CF_LOW': 1.3366, 'CF_CLOSE': 1.3385}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2792, 'OPEN_PRC': 1.2741, 'CF_HIGH': 1.2796, 'CF_LOW': 1.2713, 'CF_CLOSE': 1.274}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61, 'OPEN_PRC': 115.35, 'CF_HIGH': 115.68, 'CF_LOW': 115.28, 'CF_CLOSE': 115.34}
<StreamState.Open: 3>
>>> streaming_prices.open()
<StreamState.Open: 3>
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.state()
TypeError: 'StreamState' object is not callable
>>> streaming_prices.state
<StreamState.Open: 3>


Case2: is.open is used every time before get_snapshot and data is updated (now I get different prices):

>>> streaming_prices.state
<StreamState.Open: 3>
>>> streaming_prices.open()
<StreamState.Open: 3>
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.open()
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1133}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2793}
Fields received for JPY= : {'CF_BID': 115.59, 'CF_ASK': 115.64}
Fields received for GBP= : {'CF_BID': 1.3387, 'CF_ASK': 1.3392}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
Fields received for CAD= : {'CF_BID': 1.2789, 'CF_ASK': 1.2791}
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1133}
Fields received for GBP= : {'CF_BID': 1.3388, 'CF_ASK': 1.339}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2792}
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1132}
Fields received for GBP= : {'CF_BID': 1.3387, 'CF_ASK': 1.3391}
<StreamState.Open: 3>
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3388 1.339 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2789 1.2791 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3388 1.339 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2789 1.2791 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.open()
Fields received for JPY= : {'CF_BID': 115.59, 'CF_ASK': 115.62}
Fields received for JPY= : {'CF_BID': 115.59, 'CF_ASK': 115.63}
Fields received for CAD= : {'CF_BID': 1.2789, 'CF_ASK': 1.2791}
Fields received for GBP= : {'CF_BID': 1.3388, 'CF_ASK': 1.339}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
<StreamState.Open: 3>
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.113 1.1134 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3388 1.3389 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274
>>> streaming_prices.open()
Fields received for EUR= : {'CF_BID': 1.1131, 'CF_ASK': 1.1132}
Fields received for CAD= : {'CF_BID': 1.2789, 'CF_ASK': 1.279}
Fields received for CAD= : {'CF_BID': 1.2787, 'CF_ASK': 1.2791}
Fields received for JPY= : {'CF_BID': 115.6, 'CF_ASK': 115.61}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2792}
Fields received for CAD= : {'CF_BID': 1.2789, 'CF_ASK': 1.279}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2792}
Fields received for GBP= : {'CF_BID': 1.3388, 'CF_ASK': 1.3389}
Fields received for EUR= : {'CF_BID': 1.113, 'CF_ASK': 1.1134}
Fields received for CAD= : {'CF_BID': 1.2788, 'CF_ASK': 1.2792}
<StreamState.Open: 3>
>>> streaming_prices.get_snapshot()
Instrument CF_BID CF_ASK OPEN_PRC CF_HIGH CF_LOW CF_CLOSE
0 EUR= 1.1131 1.1132 1.1144 1.1155 1.1122 1.1143
1 GBP= 1.3387 1.3391 1.3378 1.3415 1.3366 1.3385
2 JPY= 115.6 115.61 115.35 115.68 115.28 115.34
3 CAD= 1.2788 1.2792 1.2741 1.2796 1.2713 1.274

Best Answer

  • Hi @laurens

    Unfortunately. neither myself nor members of the RDP Library team are experienced with R and the RefinitivR package you are using is not a Refinitiv product and therefore we are not able to offer any support for it.

    It may be worth reaching out to the developer of RefinitivR - to see if they can shed some light on the issue you are facing.

    You can also consider using the alternative Pricing Snapshot API I mentioned in one of my previous posts.


Answers

  • hi @laurens

    Do you require asynchronous events as well as the ability to snap as and when required? Or just the ability to snap as and when required?


  • Hi
    @umer.nalla,


    I would prefer to do it without asyncio. As I am using it in R in the end. So I would like to have an object that creates the stream (non blocking) and then use get_snapshot to get the actual value from the stream.
  • hi @laurens

    I have tested this with a13 release and cannot recreate the issue:

    1643371887394.png

    Can you please retest with a13?

    Also, if you are not interested in receiving the async event updates, you can just use the cache mechanism to snap as and when you want e.g.:
    1643372392969.png


  • Hi @laurens

    The code for the non-async technique was truncated in the snip above:

    streaming_prices = rdp.StreamingPrices(
        universe = ['EUR=','GBP=','JPY=', 'CAD='], 
        fields   = ['QUOTIM_MS', 'CF_BID','CF_ASK']
    )
    streaming_prices.open()
    ## and then
    streaming_prices.get_snapshot()
    ## as and when required...


  • Hi @umer.nalla and @jason.ramchandani01 ,


    From the attached screenshots I have the impression that these snippings are made in codebook. I don't use codebook as this can not be integrated with other information streams.

    As a consequence of your reaction I tried with a completely fresh r-eikon conda environment in miniconda.

    As can observed below also with the latest version of dataplatform and brand new miniconda and brand new conda environment no updates occur.

    I get the impression that eventhough the stream state says it is open it is actually closed and get_snapshot gives the latest result it knows. when open() is called again the stream is open for a very short time again and get_snapshot shows the latest known value. So it looks rather than streaming prices it is more like a streamed_price.


    Brand new Conda environment r-eikon as built by a newly installed miniconda

    (r-eikon) PS C:\Users\XXXX> conda list
    # packages in environment at C:\Users\XXXX\AppData\Local\R-MINI~1\envs\r-eikon:
    #
    # Name Version Build Channel
    anyio 3.5.0 pypi_0 pypi
    appdirs 1.4.4 pypi_0 pypi
    ca-certificates 2021.10.8 h5b45459_0 conda-forge
    certifi 2021.10.8 pypi_0 pypi
    chardet 3.0.4 pypi_0 pypi
    charset-normalizer 2.0.10 pypi_0 pypi
    datetime 4.3 pypi_0 pypi
    decorator 5.1.1 pypi_0 pypi
    deprecation 2.1.0 pypi_0 pypi
    eikon 1.1.14 pypi_0 pypi
    eventemitter 0.2.0 pypi_0 pypi
    h11 0.12.0 pypi_0 pypi
    h2 3.2.0 pypi_0 pypi
    hpack 3.0.0 pypi_0 pypi
    httpcore 0.14.5 pypi_0 pypi
    httpx 0.22.0 pypi_0 pypi
    hyperframe 5.2.0 pypi_0 pypi
    idna 2.10 pypi_0 pypi
    nest-asyncio 1.5.4 pypi_0 pypi
    numpy 1.22.1 pypi_0 pypi
    openssl 3.0.0 h8ffe710_2 conda-forge
    packaging 21.3 pypi_0 pypi
    pandas 1.4.0 pypi_0 pypi
    pip 21.3.1 pyhd8ed1ab_0 conda-forge
    pyparsing 3.0.7 pypi_0 pypi
    python 3.8.12 h900ac77_2_cpython conda-forge
    python-configuration 0.8.2 pypi_0 pypi
    python-dateutil 2.8.2 pypi_0 pypi
    python_abi 3.8 2_cp38 conda-forge
    pytz 2021.3 pypi_0 pypi
    refinitiv-dataplatform 1.0.0a13 pypi_0 pypi
    requests 2.27.1 pypi_0 pypi
    rfc3986 1.5.0 pypi_0 pypi
    scipy 1.7.3 pypi_0 pypi
    setuptools 60.5.0 py38haa244fe_0 conda-forge
    six 1.16.0 pypi_0 pypi
    sniffio 1.2.0 pypi_0 pypi
    sqlite 3.37.0 h8ffe710_0 conda-forge
    ucrt 10.0.20348.0 h57928b3_0 conda-forge
    urllib3 1.26.8 pypi_0 pypi
    validators 0.18.2 pypi_0 pypi
    vc 14.2 hb210afc_6 conda-forge
    vs2015_runtime 14.29.30037 h902a5da_6 conda-forge
    watchdog 2.1.6 pypi_0 pypi
    websocket-client 1.2.3 pypi_0 pypi
    wheel 0.37.1 pyhd8ed1ab_0 conda-forge
    zope-interface 5.4.0 pypi_0 pypi
    (r-eikon) PS C:\Users\XXXX>

    then I tested this with both reticulate::repl_python in r and with pycharm.

    1643385550164.png

    I also tested it in pycharm with the same result:

    1643385977568.png









  • Hi @umer.nalla

    As I could not fit in my reaction in this box please see the answer below for a reaction.


  • Hi @laurens

    I am not familiar with R - so cannot assist much in this matter.

    Bearing in mind that even with the caching technique, there is some behind the scenes async activity taking place - in order to allow the RDP library to continue receiving the asynchronous stream updates as they are received from the server and thereby keep the cache updated.

    My guess is that with R, the stream connection is not remaining open and therefore you are having to continuously re-open it in order to receive your updates.

    Hopefully, my colleague @jason.ramchandani01 or others may be able to provide some R based guidance.

    One option could be to just open a non-streaming request each time you need to snap e.g.

    streaming_prices.open(with_udpates = False)

    Otherwise, another alternative you could explore is to use the non-realtime RDP Snapshot service - which is REST-based - requiring you to snap as an when required (via a REST mechanism).

    For example with the newer RD Python library, the following makes a snap request using the RDP Snapshot API

    Example.DataLibrary.Python/TUT_2.2.01-Pricing-Snapshot.ipynb at main · Refinitiv-API-Samples/Example.DataLibrary.Python (github.com)

    # Define our RDP Snapshot Price object
    response = rd.content.pricing.Definition(
    ['EUR=', 'GBP=', 'JPY=', 'CAD='],
    fields=['BID', 'ASK']
    ).get_data()

    display(response.data.df)

    Notice the get_data() call - as opposed to the get_snapshot() and no mention of Streaming Prices.

    Please note that the RDP Snapshot API has different licencing compared to Real-Time streaming - so may not work with your desktop licence.


  • @laurens Sorry. to hear about your issue - I have tested this with

    refinitiv-dataplatform==1.0.0a11

    in a standalone python environment and it is working fine - updates are being received after I open the stream and i can see they are changing I snapshot every few seconds or so. Is it the a13 lib that is responsible have you tried to see if a11 lib works? Just a thought. Umer cannot replicate in a13. I am bit tied up at moment but i will try to look at this later.

    Actually I just look at your new build - can you drop httpx back to 0.19.0 and nest-asyncio to 1.3.3 and see if that helps?


  • I have tested this with the current release of https://github.com/GreenGrassBlueOcean/RefinitivR

    I have manually downgraded the environment as requested. I could unfortunately not simply downgrade only httpx and nest-asyncio :

    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    refinitiv-dataplatform 1.0.0a13 requires h2==3.*, but you have h2 4.0.0 which is incompatible.
    refinitiv-dataplatform 1.0.0a13 requires idna==2.*, but you have idna 3.3 which is incompatible.
    eikon 1.1.14 requires h2==3.*, but you have h2 4.0.0 which is incompatible.
    eikon 1.1.14 requires idna==2.*, but you have idna 3.3 which is incompatible.
    eikon 1.1.14 requires nest-asyncio>=1.5.1, but you have nest-asyncio 1.3.3 which is incompatible.
    Successfully installed anyio-3.5.0 httpcore-0.13.7 httpx-0.19.0
    (r-reticulate) PS C:\Users\XXXX> pip install h2==3.2.0
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    refinitiv-dataplatform 1.0.0a13 requires idna==2.*, but you have idna 3.3 which is incompatible.
    eikon 1.1.14 requires idna==2.*, but you have idna 3.3 which is incompatible.
    eikon 1.1.14 requires nest-asyncio>=1.5.1, but you have nest-asyncio 1.3.3 which is incompatible.
    (r-reticulate) PS C:\Users\XXXX> pip install idna==2.1.0
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    requests 2.27.1 requires idna<4,>=2.5; python_version >= "3", but you have idna 2.1 which is incompatible.
    eikon 1.1.14 requires nest-asyncio>=1.5.1, but you have nest-asyncio 1.3.3 which is incompatible.
    anyio 3.5.0 requires idna>=2.8, but you have idna 2.1 which is incompatible.


    Unfortunatelly Eikon requires a newer version of nest asyncio than 1.3.3 . So the whole thing gets a bit messy now.


    As can be observed from below: prices are only streaming after forcing $open() and I doubt if they are really streaming. There is also no check if prices are streaming or not. So there is no way to check if the data that you are looking at is old or actual. Quite dangerous in my eyes.

    > rdp <- RDPConnect("key")
    > universe = list("EUR=","JPY=", "GBP=", "HKD=")
    > fields=list('DSPLY_NAME', 'BID', 'ASK', 'CF_TIME')
    > StreamingPricesObject <- rdp$StreamingPrices(universe = universe, fields = fields)
    > StreamingPricesObject$open()
    StreamState.Open
    > py_snapshot <- StreamingPricesObject$get_snapshot()
    > py_snapshot
    Instrument DSPLY_NAME BID ASK CF_TIME
    0 EUR= SANTANDER HKG 1.142 1.1421 10:55:35
    1 JPY= ZUERCHER KB ZUR 114.99 115.0 10:55:35
    2 GBP= SANTANDER HKG 1.3492 1.3497 10:55:33
    3 HKD= ZUERCHER KB ZUR 7.7933 7.7934 10:55:33
    > py_snapshot <- StreamingPricesObject$get_snapshot()
    > py_snapshot
    Instrument DSPLY_NAME BID ASK CF_TIME
    0 EUR= SANTANDER HKG 1.142 1.1421 10:55:35
    1 JPY= ZUERCHER KB ZUR 114.99 115.0 10:55:35
    2 GBP= SANTANDER HKG 1.3492 1.3497 10:55:33
    3 HKD= ZUERCHER KB ZUR 7.7933 7.7934 10:55:33
    > py_snapshot <- StreamingPricesObject$get_snapshot()
    > py_snapshot
    Instrument DSPLY_NAME BID ASK CF_TIME
    0 EUR= SANTANDER HKG 1.142 1.1421 10:55:35
    1 JPY= ZUERCHER KB ZUR 114.99 115.0 10:55:35
    2 GBP= SANTANDER HKG 1.3492 1.3497 10:55:33
    3 HKD= ZUERCHER KB ZUR 7.7933 7.7934 10:55:33
    > StreamingPricesObject$open()
    StreamState.Open
    > py_snapshot <- StreamingPricesObject$get_snapshot()
    > py_snapshot
    Instrument DSPLY_NAME BID ASK CF_TIME
    0 EUR= BARCLAYS LON 1.1418 1.1422 10:55:40
    1 JPY= BARCLAYS LON 114.97 115.0 10:55:42
    2 GBP= NEDBANK LTD JHB 1.3492 1.3496 10:55:42
    3 HKD= BK OF CHINA HKG 7.7929 7.7934 10:55:41


    conda environment

    (r-reticulate) PS C:\Users\XXXX> conda list
    # packages in environment at C:\Users\XXXX\AppData\Local\R-MINI~1\envs\r-reticulate:
    #
    # Name Version Build Channel
    anyio 3.5.0 pypi_0 pypi
    appdirs 1.4.4 pypi_0 pypi
    ca-certificates 2021.10.26 haa95532_4
    certifi 2021.10.8 pypi_0 pypi
    chardet 3.0.4 pypi_0 pypi
    charset-normalizer 2.0.4 pyhd3eb1b0_0
    dataclasses 0.6 pypi_0 pypi
    datetime 4.3 pypi_0 pypi
    decorator 5.1.1 pypi_0 pypi
    deprecation 2.1.0 pypi_0 pypi
    eikon 1.1.14 pypi_0 pypi
    eventemitter 0.2.0 pypi_0 pypi
    eventkit 0.8.9 pypi_0 pypi
    h11 0.12.0 pyhd3eb1b0_0
    h2 3.2.0 pypi_0 pypi
    hpack 3.0.0 pypi_0 pypi
    httpcore 0.13.7 pypi_0 pypi
    httpx 0.19.0 py38haa244fe_0 conda-forge
    hyperframe 5.2.0 pypi_0 pypi
    ib-insync 0.9.70 pypi_0 pypi
    idna 2.1 pypi_0 pypi
    intel-openmp 2022.0.0 haa95532_3663
    libblas 3.9.0 13_win64_mkl conda-forge
    libcblas 3.9.0 13_win64_mkl conda-forge
    liblapack 3.9.0 13_win64_mkl conda-forge
    mkl 2022.0.0 h0e2418a_796 conda-forge
    nest-asyncio 1.3.3 pypi_0 pypi
    numpy 1.22.1 py38hcf66579_0 conda-forge
    openssl 1.1.1m h2bbff1b_0
    packaging 21.3 pypi_0 pypi
    pandas 1.4.0 pypi_0 pypi
    pip 21.2.2 py38haa95532_0
    pyparsing 3.0.7 pypi_0 pypi
    python 3.8.12 h6244533_0
    python-configuration 0.8.2 pypi_0 pypi
    python-dateutil 2.8.2 pypi_0 pypi
    python_abi 3.8 2_cp38 conda-forge
    pytz 2021.3 pypi_0 pypi
    refinitiv-dataplatform 1.0.0a13 pypi_0 pypi
    requests 2.27.1 pypi_0 pypi
    rfc3986 1.4.0 pyhd3eb1b0_0
    scipy 1.7.3 pypi_0 pypi
    setuptools 58.0.4 py38haa95532_0
    six 1.16.0 pypi_0 pypi
    sniffio 1.2.0 py38haa95532_1
    sqlite 3.37.2 h2bbff1b_0
    tbb 2021.5.0 h59b6b97_0
    urllib3 1.26.8 pypi_0 pypi
    validators 0.18.2 pypi_0 pypi
    vc 14.2 h21ff451_1
    vs2015_runtime 14.27.29016 h5e58377_2
    watchdog 2.1.6 pypi_0 pypi
    websocket-client 1.2.3 pypi_0 pypi
    wheel 0.37.1 pyhd3eb1b0_0
    wincertstore 0.2 py38haa95532_2
    zope-interface 5.4.0 pypi_0 pypi
    (r-reticulate) PS C:\Users\XXXX>