2017-02-22 3 views
0

Est-il possible d'exécuter un processus daphne ou même seulement des canaux Django à partir d'un script python?Est-il possible de démarrer Daphne dans un script python sans utiliser un appel OS

La méthode recommandée pour le faire, est d'exécuter

daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer 

Je me demandais si je pouvais lier cela à une variable et exécuter la tornade façon pourrait

from tornado.web import Application 
application = Application([(r"/", RosbridgeWebSocket), (r"", RosbridgeWebSocket)]) 

Répondre

1

C'est une sorte de travail autour, mais vous pouvez utiliser le module subprocess comme ceci:

subprocess.run(["daphne", "-b 0.0.0.0 -p 8001 django_project.asgi:channel_layer"])

Vérifiez ce fil Calling an external command in Python pour plus d'informations sur l'utilisation du module de sous-processus.

+0

Ouais, je sais que je peux l'appeler comme un sous-processus, mais à moins que j'écrive un tas de code IPC cela ne marcherait pas – cjds

+0

Avez-vous envisagé de créer un. sh bash script appelant daphne comme vous le feriez normalement à partir de la ligne de commande et appelez ce script du sous-processus? –

+0

C'est la façon actuelle cela fonctionne. Je l'aurais idéalement comme un objet python si – cjds

1

Je ne suis pas familier avec les canaux Django mais avez-vous essayé d'utiliser des canaux inmemory ou redis directement? Vous pourriez peut-être éviter Daphné tout à fait. D'après ce que je comprends, daphné semble être la couche de traducteur de protocole afin que les clients externes puissent communiquer avec Django via daphne (Django utilise wsgi plutôt qu'asgi pour que Django ne puisse pas gérer certains protocoles, comme la communication websocket). Tornado ne s'appuie pas sur wsgi.

Il existe des exemples dans les tests de DAPHNE: https://github.com/django/daphne/blob/master/daphne/tests/test_http.py

Le ChannelLayer inmemory n'est pas inter-processus. Je ne suis pas sûr que cela compte même dans votre cas d'utilisation. Dans le cas contraire, vous pouvez vérifier les autres backends (comme les canaux) redis https://channels.readthedocs.io/en/stable/backends.html

Cela pourrait être plus directement ce que vous cherchez: https://github.com/django/asgi_redis

+1

Je viens de commencer à lire à ce sujet la nuit dernière. En effet, cela ressemble à l'objet que je dois personnaliser pour exécuter un autre code python avec mon Daphne. Toujours en train d'y jeter un coup d'œil, mais j'espère – cjds