我如何通过pyoide在web上运行我的python文件



我写了一个python代码,我可以得到周围设备的蓝牙数据。我需要在浏览器上运行这段代码,它应该能够看到周围的ibeacon设备的数据,当每个人都是由客户端请求。太多了,我尝试了,但失败了。我认为我应该使用pyodide作为最后的手段,目前我想运行python代码,我用pyodide获得周围设备的蓝牙数据。

1-)首先是索引。我在HTML文件中包含了pyodide CDN2-)然后是pyodide。我创建了js文件,并在其中编写了以下代码

async function main(){
let pyodide = await loadPyodide();
await pyodide.runPythonAsync(`
from pyodide.http import pyfetch
response = await pyfetch("beacon.py")
with open("beacon.py", "wb") as f:
f.write(await response.bytes())
`)
pkg = pyodide.pyimport("main()");
pkg.do_something();
}
main();

3-)从外部在这段代码beacon.py我想包括文件和beacon.py我想在其中运行main()函数。这是beacon.py代码

import asyncio
from uuid import UUID
import json 
from construct import Array, Byte, Const, Int8sl, Int16ub, Struct
from construct.core import ConstError
from bleak import BleakScanner
from bleak.backends.device import BLEDevice
from bleak.backends.scanner import AdvertisementData

ibeacon_format = Struct(
"type_length" / Const(b"x02x15"),
"uuid" / Array(16, Byte),
"major" / Int16ub,
"minor" / Int16ub,
"power" / Int8sl,
)
class UUIDEncoder(json.JSONEncoder):
def default(self, uuid):
if isinstance(uuid, UUID):
# if the obj is uuid, we simply return the value of uuid
return uuid.hex
return json.JSONEncoder.default(self, uuid)
def device_found(
device: BLEDevice, advertisement_data: AdvertisementData
):
"""Decode iBeacon."""
try:
macadress = device.address
name = advertisement_data.local_name
apple_data = advertisement_data.manufacturer_data[0x004C]
ibeacon = ibeacon_format.parse(apple_data)
uuid = UUID(bytes=bytes(ibeacon.uuid))
minor = ibeacon.minor 
major = ibeacon.major 
power = ibeacon.power
rssi = device.rssi
rssi = int(rssi)
# beacons = { 
#     "Mac Adress" : macadress,
#     "Local Name" : name ,
#     "UUID":uuid,
#     "Major":major,
#     "Minor":minor,
#     "TX Power":power,
#     "RSSI":rssi
# } 
print(f"Mac Adress : {macadress}")
print(f"Local Name : {name}")
print(f"UUID     : {uuid}")
print(f"Major    : {major}")
print(f"Minor    : {minor}")
print(f"TX power : {power} dBm")
print(f"RSSI     : {rssi} dBm")
print(47 * "-") 

except KeyError:
pass
except ConstError:
pass
async def main():
"""Scan for devices."""
scanner = BleakScanner()
scanner.register_detection_callback(device_found)

while (True):
await scanner.start()
await asyncio.sleep(0.5)
await scanner.stop()

asyncio.run(main())
通常情况下,Beacon.py文件中的所有库都已安装,但我得到以下错误
File "/home/pyodide/beacon.py", line 4, in <module>
from construct import Array, Byte, Const, Int8sl, Int16ub, Struct
ModuleNotFoundError: No module named 'construct'

5-)我不知道为什么我得到这个错误。我希望我能把我的问题解释清楚。我如何通过pyodide在pyodide文件中包含main()函数以及如何在web上运行此代码?

Pyodide运行在浏览器沙盒中,通常不允许与驱动程序(特别是蓝牙设备)直接交互。因此,您将无法使用Pyodide的bleak包。

你可以通过Web蓝牙API访问蓝牙设备,你可以在Python中使用Pyodide FFI。

关于construct的ImportError,该包需要针对emscripten/wasm32架构进行编译,目前不包含在Pyodide发行版中。您可以使用以下指令自己构建相应的轮子

相关内容

  • 没有找到相关文章

最新更新