[Python] Data uit socket tonen als output
Ik heb dus een mooi Python-script wat via ZeroMQ een datastroom binnenhaalt (treinposities), en dat werkt perfect, en ik krijg om de tien seconden een mooie XML-feed binnen in het text-bestand. Maar dat moet ook zonder het schrijven van een bestand kunnen.
Op het huidige moment wordt constant de data in de ZeroMQ-datastroom weggeschreven naar een bestand.
Nu wil ik dit realtime kunnen outputten op een webservertje, en ik dacht zelf aan de PyBottle-plugin om een mini-webserver op te zetten.
Echter... hoe krijg ik de XML-feed van het huidige moment daarin te zien?
Hopelijk zijn er hier mensen die Python-kennis hebben, en snappen wat ik bedoel. Of als iemand het beter zou kunnen dan dit, let me know.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python2
from gzip import GzipFile
from cStringIO import StringIO
from subprocess import call
import zmq
context = zmq.Context()
subscriber = context.socket(zmq.XSUB)
subscriber.connect("tcp://pubsub.*******.nl:7664")
subscriber.send(chr(0x01) + "/RIG/NStreinpositiesInterface5") # 0x01 = subscribe, 0x00 = unsubscribe
x=0
while True:
multipart = subscriber.recv_multipart()
address = multipart[0]
contents = ''.join(multipart[1:])
contents = GzipFile('','r',0,StringIO(contents)).read()
filename="tmp/treinpos.txt"
file = open(filename,"w")
file.write(contents)
file.close()
subscriber.close()
context.term()
from gzip import GzipFile
from cStringIO import StringIO
from subprocess import call
import zmq
context = zmq.Context()
subscriber = context.socket(zmq.XSUB)
subscriber.connect("tcp://pubsub.*******.nl:7664")
subscriber.send(chr(0x01) + "/RIG/NStreinpositiesInterface5") # 0x01 = subscribe, 0x00 = unsubscribe
x=0
while True:
multipart = subscriber.recv_multipart()
address = multipart[0]
contents = ''.join(multipart[1:])
contents = GzipFile('','r',0,StringIO(contents)).read()
filename="tmp/treinpos.txt"
file = open(filename,"w")
file.write(contents)
file.close()
subscriber.close()
context.term()
Gewijzigd op 03/11/2017 19:44:48 door - Ariën -
Je kan ook hetzelfde in PHP doen lijkt mij?
Gewijzigd op 04/11/2017 10:34:24 door - Ariën -
Uhm ja twee talen door elkaar gebruiken zou ik ook geen voorstander van zijn als daar niet een verdomd goede reden voor is. En ja natuurlijk als je zin hebt om een andere taal te leren dan is dat goed om te doen. Maar ik dacht Ariën heeft vast al een dijk van een PHP applicatie staan ;-)
Uiteindelijk verwerk ik het wel in PHP. Maar het gaat eropm dat ik gewoon de XML-content realtime kan ophalen.
Frank Nietbelangrijk op 04/11/2017 10:31:37:
Oplossingen worden te vaak en zonder nadenken gerealiseerd met het programmeertaaltje dat men kent. Lang niet altijd met de programmeertaal die het meest geschikt is voor de toepassing. Python is veel geschikter en kan veel sneller opdrachten af handelen dan PHP. Ik heb ook wel PHP oplossingen op mijn bureau gekregen die ik probleemloos met een eenvoudig Unix/Linux command script kon oplossen. Waarom PHP in een cron job zetten als je het op kan lossen met Unix/Linux command script of Python? Doorgaans vanwege gebrek aan kennis en inzicht in deze andere programmeertalen. Soms kan het niet anders omdat de gehuurde omgeving te simpel is, men kan niet bij het operatingsystem en er zijn alleen wat van die onhandige webtools zoals phpadmin en dergelijke beschikbaar. Dan moet je alles wel met PHP regelen.....Je kan ook hetzelfde in PHP doen lijkt mij?
Volgens mij hoeft het niet eens heel lastig te zijn.
Als ik eens wist waarop ik moest zoeken, dan had ik het mogelijk wel kunnen vinden.
Gewijzigd op 06/11/2017 13:03:03 door - Ariën -
Update'je: Inmiddels ben ik bezig om te kijken naar Flask. Hiermee kan je een webserver in Python opzetten waarbij deze via de CLI als webserver wordt opgestart, en dus niet vanuit het script. Of het werkt, dat zullen we snel genoeg zien. Het schijnt zelfs beter dan Bottle te zijn, lees ik her en der.
is/was je uiteindelijke probleem niet dat je niet weet hoe je een XML feed moet uitlezen met python?
Zelf heb ik op diezelfde server al een Nginx-server draaien, dus ik dacht er zelf aan om met de proxy-configuratie daarin die Python-webserver aan te roepen via de (fictieve) URL: http://services.website.nl/locaties_api
Die XML lees ik verder uit met PHP, maar dat gebeurt op een andere server en valt buiten de scope van dit vraagstuk. En ja, dat Python-script blijft op een andere server uitgevoerd worden. Daar wil ik niet omheen draaien ;-)
Gewijzigd op 28/11/2017 12:15:00 door - Ariën -
Het ging er mij om dat, net zoals php flask zo'n zelfde optie er in heeft zitten om een develop servertje op te zetten. Als alles uiteindelijk werkt, dan is het wel van belang dat je daar een "echte" webserver aan je applicatie knoopt. Met welk python framework je aan de gang gaat is ook niet van belang.
Immers is het aan jou om te kijken welk framework jou het beste bevalt.
Als je uiteindelijk alles klaar hebt dan kan je de Nginx server makkelijk gebruiken om je applicatie te laten draaien: http://flask.pocoo.org/docs/0.12/deploying/uwsgi/
Toevoeging op 29/11/2017 08:29:55:
Soms is het gemakkelijker om het roer om te gooien. Met NodeJS heb je al een webserver ineen, en met een paar extra modules kan je al een ZMQ-socket uitlezen.
Dat is dus de nieuwe inslag die ik gemaakt heb. En tot nu toe werkt die best lekker.
Het is dan geen PHP, maar toch een programmeertaal waar ik mij prettiger bij voel. ;)
Nu nog even uitzoeken hoe gzip ermee om gaat.
Gewijzigd op 29/11/2017 08:32:17 door - Ariën -