Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Crossbar.io avec Python3 dans un environnement virtuel

+3 votes

Je souhaiterais utiliser Crossbar.io dans un environnement virtuel créé avec pew et programmer mes components en Python3, avec asyncio.

Est-ce une bonne idée ou est-il préférable de rester à Python2 et twisted ?

Quelle version de Python faut-il spécifier à pew ?

Où dire à Crossbar que je souhaite employer Python3 pour interpréter mes components ?

demandé 2-Jan-2015 par Vayel (1,050 points)

Il faut voir crossbar comme un service comme apache. Donc on peut se faire un virtual env en python 3 qui cause avec crossbar. Ce que sam n'a eu de cesse de me répéter jusqu'à je le retienne enfin ;)
Donc mettre crossbar dans un coin et le reste des composants wamp dans un venv p3.
Je ne peux pas plus développer c'est l'heure du dîner ;)
Bon courage

Ca je l'avais compris, mais merci tout de même. Et bon appétit. :)

Ce que j'ignorais, c'est qu'on pouvait lancer des composants sans passer par crossbar (cf : la réponse de Sam).

1 Réponse

+3 votes
 
Meilleure réponse

Crossbar est uniquement python 2.7 (twisted est en cours de portage vers python 3), il faut donc l'installer avec python 2.7.

Néanmoins c'est un composant qu'on ne programme pas. On peut le traiter comme une boîte noire comme apache et nginx : tu installe, un fichier de config, et pouf. Tu peux l'installer directement au niveau du système (sur linux/mac, python 2.7 est le python par défaut) : pip install --user crossbar.

Ce que tu code, c'est la partie qui fait du pub/sub et rpc, c'est à dire les clients, avec la lib autobahn. Et ça, tu peux le coder en Python 3.

Ensuite, lance ton client :

pew workon tonenv
python tonscript.py

Et ça roule.

Si tu veux démarrer le components via crossbar, tu peux lui spécifier le chemin vers son executable dans le json via (de tête, à tester) :

  {
      "type" : "container", 
      "options" : {
          "python": "/chemin/vers/le/python/de/ton/env"
       }, 
répondu 2-Jan-2015 par Sam (4,978 points)
sélectionné 3-Jan-2015 par Vayel

C'est donc ça ! Je pensais qu'il fallait nécessairement passer par le fichier de configuration de crossbar pour démarrer des composants.

Par contre, je suis obligé de rajouter la fin du code ici pour démarrer mon composant, non ?

Tu peux juste faire :

from autobahn.twisted.wamp import ApplicationRunner

if __name__ == "__main__":

    runner = ApplicationRunner(url = "ws://localhost:8080/ws", realm = "realm1")
    runner.run(TaClasse)

C'est plus simple, en effet.

Par contre, puis-je démarrer plusieurs composants dans le même fichier ? Avoir un fichier start.py comme ça :

from autobahn.asyncio.wamp import ApplicationRunner

from components.app import AppComponent
from components.data import DataComponent
from components.locator import LocatorComponent

from settings import WS_URL, REALM


if __name__ == "__main__":
    appRunner = ApplicationRunner(url = WS_URL, realm = REALM)
    appRunner.run(AppComponent)

    dataRunner = ApplicationRunner(url = WS_URL, realm = REALM)
    dataRunner.run(DataComponent)

    locatorRunner = ApplicationRunner(url = WS_URL, realm = REALM)
    locatorRunner.run(LocatorComponent)

Un truc comme ça fonctionne bien aussi. Mais du coup, twisted required.

Tu peux passer par le multiprocessing. Tu aurais ça :

start.py :

from components.app import AppComponent
from components.data import DataComponent

if __name__ == "__main__":
    AppComponent()
    DataComponent()

components/app.py :

from topics import TOPICS
import tools



app = tools.Application()


class AppComponent:
    """
        Launch the app.
    """

    @tools.run(app)
    def __init__(self):
        pass

    @app.register(TOPICS.getTopics)
    def getTopics(self):
        """
            Return the topics as JSON object.

            :return: The topics as JSON object.
            :rtype: dict
        """

        return TOPICS.getJSON()

tools.py :

def run(app):
    def decorator(func):
        def wrapper(*args, **kwargs):
            func(*args, **kwargs)

            obj = args[0] # self
            print("{} is running.".format(obj.__class__.__name__))

            p = Process(target=app.run, args=(WS_URL, REALM))
            p.start()

        return wrapper

    return decorator

Si tu as d'autres questions, ouvres de nouvelles questions. Il faut que chaque page soit "une question => une réponse acceptée". Le but est que quelqu'un qui cherche la solution à ton problème trouve facilement et ne doivent pas se taper 1000 lignes de texte.

...