How to Install Python Barcode SDK via Pip on Apple M1 Mac

Someone may be curious about whether Intel-based Python apps can work well on Apple M1 Mac. I recently did a test with Dynamsoft Python Barcode SDK, which is built with native x86_64 libraries and CPython. It turned out that there was no issue using pip to install the wheel package and running my Python barcode reader app.

Installing Pip and Python Barcode Wheel Package

When you open the terminal app and type in Python3 the first time, a prompt dialog will pop up for installing the command line developer tools.

Click Install and wait a while for installing the relevant tools. After that, you can run python3 successfully in the terminal.

The next step is to install pip:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py

Once pip is ready, you can try to install Dynamsoft Python Barcode SDK:

python3 -m pip install dbr

Don’t be surprised if you see the failure message.

You are trying to install an x86_64 wheel package on ARM64 architecture. However, don’t be frustrated because Rosetta 2 can make it work. Let's take a look at the Python3 architecture:

% file $(which python3)
/usr/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/python3 (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python3 (for architecture arm64e): Mach-O 64-bit executable arm64e

As you can see the Python 3 is a universal app, supporting x86_64. Therefore, we can install the x86_64 wheel package by specifying the arch:

arch -x86_64 $(which python3) -m pip install dbr

Congratulations! You have installed Dynamsoft Python Barcode SDK. From now on, you can get started to create a barcode scanning app with a webcam.

Building Webcam-based Python Barcode Reader on Apple M1 Mac

Install OpenCV-Python for capturing webcam video stream:

arch -x86_64 $(which python3) -m pip opencv-python

Open a camera and display the video stream in real-time:

import cv2 as cv
cap = cv.VideoCapture(0)
while True:
_ret, frame = cap.read()

if not _ret:
break

cv.imshow('BarcodeReader', frame)

ch = cv.waitKey(1)
# ESC
if ch == 27:
break

Since scanning barcode is a CPU-intensive task, we should run it in Python Process rather than Python thread:

from dbr import *
from multiprocessing import Process, Queue

def process_barcode_frame(license, frameQueue, resultQueue):
# Create Dynamsoft Barcode Reader
reader = BarcodeReader()
# Apply for a trial license: https://www.dynamsoft.com/customer/license/trialLicense
reader.init_license(license)
settings = reader.get_runtime_settings()
settings.max_algorithm_thread_count = 1
reader.update_runtime_settings(settings)

while True:
results = None

try:
frame = frameQueue.get(False, 10)
if type(frame) is str:
break
except:
continue

try:
frameHeight, frameWidth, channel = frame.shape[:3]
results = reader.decode_buffer_manually(np.array(frame).tobytes(), frameWidth, frameHeight, frame.strides[0], EnumImagePixelFormat.IPF_RGB_888)
except BarcodeReaderError as error:
print(error)

try:
resultQueue.put(results, False, 10)
except:
pass

barcodeScanning = Process(target=process_barcode_frame, args=(license, frameQueue, resultQueue))
barcodeScanning.start()

Note: you need a valid SDK license as well.

In the main process, create two queues for continuously sending image frames and receiving barcode scanning results:

frameQueue = Queue(size)
resultQueue = Queue(size)

while True:
_ret, frame = cap.read()

if not _ret:
break

try:
results = resultQueue.get(False, 10)
except:
pass

cv.imshow('BarcodeReader', frame)

# Append a frame to the frame queue
try:
frameQueue.put(frame.copy(), False, 10)
except:
pass

ch = cv.waitKey(1)
# ESC
if ch == 27:
break

Now, we can test the Python barcode program:

arch -x86_64 $(which python3) barcode_scanning.py license.txt

One more thing, you may fail to run the app due to the camera permission restriction. Instead of the terminal app, you can install iTerm2 to request the camera access.

Finally, we can do barcode scanning on Apple M1 Mac.

Source Code

https://gist.github.com/yushulx/c6666905d083d26b4d51316530faec56

Originally published at https://www.dynamsoft.com on December 21, 2020.

Manager of Dynamsoft Open Source Projects | Tech Lover

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store