Держите скрипт Python слушать в фоновом режиме - PullRequest
3 голосов
/ 09 апреля 2019

Я сделал действительно простой скрипт на python, который прослушивает порт ip +.У меня есть сетевой сканер штрих-кода, который отправляет orderID на эту комбинацию ip + порт, и этот скрипт получает метку от API, который отправляет его на принтер.Работает как надо, запускаю на малине.

Моя единственная проблема - всякий раз, когда я хочу запустить его как службу, которая постоянно работает, и прослушивать ip для нового сканирования, он только прослушивает первое сканирование и печатает правильную метку, но второе сканирование получает то же самоеlabel.

import socket
import urllib.request
import cups
import base64
import json
import re
from PIL import Image

PrintConn = cups.Connection()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.18.208', 51235))

while 1:
        contin = False
        data = s.recv(512)
        print(data)
        if not data: break
        if not data == b'\x02\x18\r\n':
                 contin = True
        barCode = re.findall(r'\d+', data.decode("utf-8"))
        print("https://example.com/api/upsgif/{}".format(''.join(map(str, barCode))))

        if contin:
            try:
                        url = "https://example.com/api/upsgif/{}".format(''.join(map(str, barCode)))
                        req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"})
                        response = urllib.request.urlopen(req).read().decode('utf-8')
                        if not response: break
        upsGif = bytes(response, 'utf-8')
                        if not upsGif: break
                        if upsGif == b'\n': break

                        except urllib.error.HTTPError:
                        print('Error while getting order label')
            else:
                        with open("label.png", "wb") as fh:
                                fh.write(base64.decodebytes(upsGif))

                        img = Image.open('label.png')

                        PrintConn.printFile('Zebra_Printer', '/var/www/label.png', "",{'fit-to-page':'True'})

И это сервис, который я сделал:

[Unit]
Description=Autoinpak keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
ExecStart=/var/www/runClient.sh
ExecStop=/usr/bin/killall -9 autoinpak
Restart=always
TimeoutSec=infinity
# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

И скрипт bash:

#!/bin/bash
while true; do
    sudo python3 /var/www/client.py &>/var/log/python/client.log
    wait $!
    sleep 10
done
exit                                                               

Я ожидал, что он будет работатьтак же, как когда я запускаю скрипт из терминала (python3 /var/www/client.py), но вместо этого он все время использует один и тот же файл upsgif, поэтому каждый отпечаток этикетки совпадает с первым сканированием, которое я выполняю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...