Oct-24-2021, 09:51 PM
(This post was last modified: Oct-24-2021, 09:51 PM by DeaD_EyE.
Edit Reason: Automatically bring up a SocketCAN interface on boot
)
(Oct-24-2021, 10:20 AM)Larz60+ Wrote: although rather old, looks promising: https://pypi.org/project/can4python/
But he still has to add/configure and bring up the can interface.
The
os.system
call is the worst you can use.os.system('ip link set can0 up type can bitrate 250000 restart-ms 10000')Make a nice function from it, then you don't add another dependency from pypi and the function could be as minimal as required.
from __future__ import annotations import subprocess def configure_can( interface: str, bitrate: int = 250_000, restart_seconds: float | int = 10, sudo: bool = False, ) -> bool: """ Configure existing can interface Return True if success, otherwise False If sudo is True, ip will run with sudo """ restart_ms = int(restart_seconds * 1_000) cmd = [ "ip", "link", "set", interface, "up", "type", "can", "bitrate", str(bitrate), "restart-ms", str(restart_ms), ] if sudo: cmd.insert(0, "sudo") # to see which command will run # print(" ".join(cmd)) # ip or in general all commands return 0 if the operation was successful # in all other cases (errors) the returncode is not equal to 0 return subprocess.run(cmd, stderr=subprocess.DEVNULL).returncode == 0 print(configure_can("can0")) # fails on my system (no can)If you're already using Python 3.10.0, you can remove the __future__ import.
But it's required, if an older Python-Version is used, because of the type annotations.
The same function without annotations:
import subprocess def configure_can(interface, bitrate=250_000, restart_seconds=10, sudo=False): """ Configure existing can interface Return True if success, otherwise False If sudo is True, ip will run with sudo """ restart_ms = int(restart_seconds * 1_000) cmd = [ "ip", "link", "set", interface, "up", "type", "can", "bitrate", str(bitrate), "restart-ms", str(restart_ms), ] if sudo: cmd.insert(0, "sudo") # to see which command will run # print(" ".join(cmd)) # ip or in general all commands return 0 if the operation was successful # in all other cases (errors) the returncode is not equal to 0 return subprocess.run(cmd, stderr=subprocess.DEVNULL).returncode == 0 print(configure_can("can0")) # fails on my system (no can)You can also bring up the interface during boot: https://www.pragmaticlinux.com/2021/07/a...e-on-boot/
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!