Python API import issues

Hi Solace Community,

I have a strange issue with the Python API - or I might just be dumb right now :wink:

I’ve started with a pretty simple script that connects to a broker and just reports the client id and disconnects. (removed sensitive values…)

from solace.messaging.messaging_service import MessagingService, RetryStrategy
from solace.messaging.config.authentication_strategy import BasicUserNamePassword
from solace.messaging.config.transport_security_strategy import TLS


def main():
    broker_props = {"solace.messaging.transport.host": "tcps://myhost",
                    "solace.messaging.service.vpn-name": "myvpn"}

    transport_security = TLS.create().without_certificate_validation()

    messaging_service = MessagingService.builder() \
        .from_properties(broker_props) \
        .with_authentication_strategy(BasicUserNamePassword("username", "*****")) \
        .with_connection_retry_strategy(RetryStrategy.forever_retry(10000)) \
        .with_reconnection_retry_strategy(RetryStrategy.forever_retry(10000)) \
        .with_transport_security_strategy(transport_security) \
        .build()

    messaging_service.connect()

    if messaging_service.is_connected:
        print(messaging_service.get_application_id())
        messaging_service.disconnect()


if __name__ == "__main__":
    main()

My project structure looks pretty simple (I’m using activated venv):

.venv
receive_events.py

And when I run this script with my virtualenv enabled I get this:

app_8a54949a-e460-4e0b-bce0-354743572c53

So the script is working fine, Solace API seems to be installed correctly in my .venv aso…

Now let’s move the script to a subfolder like src

.venv
src/
   receive_events.py

When I run python src/receive_events.py or cd into src and then run python receive_events.py I get

Traceback (most recent call last):
  File "src/receive_messages.py", line 1, in <module>
    from solace.messaging.messaging_service import MessagingService, RetryStrategy
ModuleNotFoundError: No module named 'solace.messaging'

I tried out setting PYTHONPATH to different values - but no luck.

which python
.venv/bin/python

find .venv | grep solace/messaging/__init__
.venv/lib/python3.8/site-packages/solace/messaging/__init__.py

I’m using solace_pubsubplus-1.2.1

Sorry, but I’m lost :wink:
I’haven’t had any issues with other libraries - in fact src/ contains a Django App where I wanted Solace to connect with…

Hey @ahabel ! Thanks for raising this issue. I’m curious to know what version of python and pip are you using? I would also recommend upgrading your pip after you have activated your virual env pip install --upgrade pip

From the explanation of your setup, there should not be a discrepancy in behaviour if you change the location of your python script directory if you have activated you virtual environment (which seems like you have). In fact, this is the same setup we use in our python samples.

This is how I have my local environment configured

## Create virtual environment
~/samples/solace-samples-python > python3 -m venv venv

## Activate virtual environment
~/samples/solace-samples-python > source venv/bin/activate
~/samples/solace-samples-python > which python                                                                        py solace-samples-python
/Users/tamimi/samples/solace-samples-python/venv/bin/python
~/samples/solace-samples-python > python --version                                                                    py solace-samples-python
Python 3.8.9

## Upgrade pip
~/samples/solace-samples-python > pip install --upgrade pip                                        py solace-samples-python
Collecting pip
  Using cached pip-21.3.1-py3-none-any.whl (1.7 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.2.3
    Uninstalling pip-20.2.3:
      Successfully uninstalled pip-20.2.3
Successfully installed pip-21.3.1
~/samples/solace-samples-python > pip --version                                                                       py solace-samples-python
pip 21.3.1 from /Users/tamimi/samples/solace-samples-python/venv/lib/python3.8/site-packages/pip (python 3.8)

## Install requirements
~/samples/solace-samples-python > pip install -r requirements.txt                                  py solace-samples-python
Collecting certifi==2020.12.5
  Using cached certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
Collecting chardet==4.0.0
  Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting idna==2.10
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting requests==2.25.1
  Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting solace-pubsubplus==1.2.1
  Using cached solace_pubsubplus-1.2.0-py36-none-macosx_10_15_x86_64.whl (5.2 MB)
Collecting urllib3==1.26.4
  Using cached urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
Installing collected packages: urllib3, idna, chardet, certifi, solace-pubsubplus, requests
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 solace-pubsubplus-1.2.0 urllib3-1.26.4
~/samples/solace-samples-python > pip list                                                                            py solace-samples-python
Package           Version
----------------- ---------
certifi           2020.12.5
chardet           4.0.0
idna              2.10
pip               21.3.1
requests          2.25.1
setuptools        49.2.1
solace-pubsubplus 1.2.1
urllib3           1.26.4
~/samples/solace-samples-python > l                                                                                   py solace-samples-python
README.md        howtos           patterns         requirements.txt venv
~/samples/solace-samples-python > l patterns                                                                      py solace-samples-python
TLS_connection.py        direct_subscriber.py     guaranteed_subscriber.py trusted-store
direct_publisher.py      guaranteed_publisher.py  hello_world_pubsub.py

## Run Python application
~/samples/solace-samples-python > python patterns/direct_subscriber.py                                                py solace-samples-python
Messaging Service connected? True
Direct Subscriber is running? True
Subscribing to: ['solace/samples/python/dir/sub/>', 'solace/samples/python/dir/sub/v2/>', 'solace/samples/>']

and I am able to run my python script under the patterns directory (which is not in the same level where my venv virtual environment folder is)

Let me know if this is helpful and if you are still facing the same issue

Hi @Tamimi,

thanks for your hints. Finally I solved the issue… :smile:

TLDR; I’ve had a folder called solace under src, so the import tried to find the client API in this folder instead of the site-packages in .venv. After renaming the subfolder, everything works fine.