Как реализовать обратный вызов с помощью PyCall?Python

Программы на Python
Ответить
Anonymous
 Как реализовать обратный вызов с помощью PyCall?

Сообщение Anonymous »

Я хотел бы получить доступ к пакету Python в Ruby с помощью PyCall.
Неблокирующая функция в приведенном ниже коде Python активирует обратный вызов.
Не могли бы вы помочь мне реализовать обратный вызов?

Код: Выделить всё

#!/usr/bin/env python
# start_reading.py
import time
import mercury

def found(tag):
print(tag.epc.decode()) # Check check
# print(tags[1].epc.decode())

reader = mercury.Reader("tmr:///dev/ttyUSB0")

reader.start_reading(found, on_time=250, off_time=0)
time.sleep(0.5)
reader.stop_reading()
Вывод start_reading.py:

Код: Выделить всё

b'001853000000000000000012'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
b'001853000000000000000012'
b'34155CACB400000000000125'
b'001853000000000000000012'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
Это относится к API для считывателей ThingMagic RFID, который представляет собой оболочку Python для исходного API, написанного на C.
Из документации:

reader.start_reading(callback, on_time=250, off_time=0)
Запускает асинхронное чтение. Он немедленно возвращается и начинает последовательность операций чтения или непрерывное чтение. Результаты передаются обратному вызову. Чтения повторяются до тех пор, пока не будет вызван метод reader.stop_reading().
  • callback(TagReadData) будет вызываться для каждого обнаруженного тега.
  • on_time устанавливает продолжительность в миллисекундах для активного запроса считывателя.
  • off_time продолжительность в миллисекундах для читатель должен молчать во время запроса
Как следует из следующих частей, которые я получил, используя одну функцию чтения. Сначала код Python, затем Ruby.

Код: Выделить всё

#!/usr/bin/env python
# read.py
import mercury
reader = mercury.Reader("tmr:///dev/ttyUSB0")

data = reader.read()
print(data)
print(f"type: {type(data)}")
Вывод read.py:

Код: Выделить всё

[EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
type: 

Код: Выделить всё

#!/usr/bin/env ruby
# read.rb
require 'pycall/import'
include PyCall::Import
pyimport :mercury

reader = mercury.Reader.new("tmr:///dev/ttyUSB0")

python_data = reader.read()
puts "python_data: #{python_data}"
puts "python class: #{python_data.class}"
puts ""
ruby_data = python_data.to_ary
puts "ruby_data: #{ruby_data}"
puts "ruby class: #{ruby_data.class}"
Вывод read.rb:

Код: Выделить всё

python_data: [EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
python class: 

ruby_data: [EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
ruby class: Array
Вышеуказанное работает, как вы можете видеть.
Решением для обратного вызова должно быть улучшение следующего кода.

Код: Выделить всё

#!/usr/bin/env ruby
# start_reading.rb
require 'pycall/import'
include PyCall::Import
pyimport :mercury

def found(tag)
puts tag.epc
end

reader = mercury.Reader.new("tmr:///dev/ttyUSB0")

reader.start_reading(found, on_time=250, off_time=0) # What should I do here?
sleep(0.5)
reader.stop_reading()
Текущий вывод start_reading.rb

Код: Выделить всё

start_reading.rb:7:in `found': wrong number of arguments (given 0, expected 1) (ArgumentError)
from start_reading.rb:14:in `'
EDIT — для пояснения.
Я думаю, что read.start_reading() должен получить что-то, что понимает Python, сейчас он получает код Ruby.
Следовательно, «найденную» функцию (или лямбда) и переменные необходимо перевести из Ruby (Ru) в Python (Py) с помощью PyCall.
Я показал, что могу использовать PyCall для вызова Py Reader из Ru и перевести вывод из списка в массив. Итак, первый и последний шаг сделаны, отлично. Но каждое промежуточное взаимодействие также должно быть связано с PyCall (т. е. «найденной» функцией от Ru до Py).
В этом, я думаю, и заключается проблема.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-pycall
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»