You installed a fresh Python, ran pip install harvesters, and pip answered No matching distribution found for genicam. The traceback looks like a network or packaging failure, but it almost always means one thing: no wheel published for the genicam package matches your interpreter's version, architecture or platform. This guide walks you through diagnosing which of the three is wrong, fixing it with a pinned environment, and getting the GenICam acquisition stack running with GigE area scan cameras or USB3 cameras.
The symptom and what it actually means
The full error is usually:
ERROR: Could not find a version that satisfies the requirement genicam
ERROR: No matching distribution found for genicam
When pip resolves a dependency it filters the package's published files by three criteria: the Python interpreter version (encoded in the wheel tag, for example cp37), the architecture (win_amd64, manylinux variants), and the platform. If every wheel is filtered out, pip reports the package as having "versions: none" — it does not tell you why nothing matched. So the error is a compatibility report, not evidence the package was removed.
The GenICam reference implementation behind the package is C++ with prebuilt binaries, so each release supports a specific list of CPython versions. Support for a brand-new interpreter arrives one or two releases later. Installing on a day-old Python is the classic way to hit this: expect a gap of 6 to 12 months between a new interpreter release and wheels for the native imaging packages.
Likely causes, in order of probability
- Python version too new (or too old). The most common case by far. The genicam package had no Python 3.8 wheel when 3.8 shipped; the same gap repeats with each new interpreter.
- 32-bit interpreter. The GenICam binaries are built for 64-bit architectures only. A 32-bit Python on a supported version still sees zero matching wheels.
- Unsupported platform or toolchain. Cygwin's GCC, for example, is not supported by the GenICam binaries, so a Cygwin Python cannot use the wheels at all.
- Network or proxy filtering. Corporate proxies can block PyPI or serve an empty index; pip then legitimately finds nothing. This is the least likely cause but worth ruling out last.
Step 1: confirm what you are running
Before changing anything, record the facts:
python -V
python -c "import struct; print(struct.calcsize('P') * 8)"
python -c "import sys; print(sys.platform)"
You want a 64-bit CPython on a mainstream platform (Windows, Linux or macOS). If the second command prints 32, you have found your problem already — reinstall a 64-bit distribution. Note that a 64-bit operating system says nothing about the interpreter; both Anaconda and python.org offer 32-bit builds that install happily on 64-bit Windows.
Step 2: check which Python versions have wheels
Open the genicam package page on PyPI and look at its file list: each wheel's name embeds the interpreter tag, such as cp37 for CPython 3.7 or cp311 for 3.11, plus the platform tag. Pick the newest interpreter that has a wheel for your platform. That version — not the newest Python release — is what your acquisition environment should pin.
Step 3: create an environment pinned to a supported interpreter
With Anaconda or Miniconda:
conda create -n gentl python=3.7
conda activate gentl
python -V
pip install harvesters
With plain venv, first install a Python of the supported version, then:
py -3.7 -m venv gentl
gentl\Scripts\activate
pip install harvesters
When the interpreter matches a published wheel, pip resolves genicam>=1 normally and prints the wheel filename as it downloads. That filename — with its cp tag and win_amd64 or manylinux tag — is your confirmation that all three filter criteria line up.
Step 4: verify the acquisition stack, not just the install
An install that reports success is only half the test. Verify you can list and open a device:
- Confirm the import works:
python -c "from harvesters.core import Harvester; print('ok')". - Point Harvester at your GenTL producer (the
.ctifile that ships with your interface card or camera vendor's transport layer). - Update the producer list, enumerate devices and check your camera appears.
- Acquire one frame and check its pixel format and size against the camera's specification.
Once a device opens, the same environment handles the rest of the stack: setting camera exposure time through a GenICam API in Python uses the node map you now have access to, and hardware triggered image acquisition in Python builds on the same acquisition object. If you deploy on ARM hosts, check binary compatibility there too — see ARM64 machine vision acquisition: check binary compatibility.
Hardware that pairs with the environment
The interpreter choice is independent of the camera, but the transport matters for the host set-up. A GigE camera such as the MV-CU020-90GC needs a wired NIC, ideally on a dedicated port; a quad-port PoE card like the LS-FGB-0004 gives several GigE cameras power and data on one PCIe slot. For a USB3 camera such as the MV-CH120-11UC, use a controller with a direct chipset connection rather than a hub.
- Sensor format
- 1/1.7"
- Lens mount
- C-mount
- Interface
- GigE
- Resolution
- Up to 3 MP
- Interface
- GigE
If a NIC is involved, the frame grabbers category covers GigE, 10GigE and CoaXPress host cards, and the camera finder filters by interface so the transport layer you have already installed matches what you buy next. Bitness matching bites on the hardware side too — the same version-and-bitness rule explains why LabVIEW package links must match version and bitness when instrument libraries join the vision stack.
When the usual answer is wrong
-
The proxy is the real cause. If PyPI itself is unreachable, even a correctly pinned environment fails. Test with
pip download genicam --no-deps; if that times out after a minute or so, fix the proxy or use an internal index before blaming Python versions. -
You need the newest Python for other reasons. A project built on a newer interpreter's features — the
multiprocessing.shared_memorymodule, for instance — should not be downgraded wholesale. Instead, run acquisition in a small helper process on the pinned environment and hand frames to the main application through shared memory or a socket. You keep the language features and the working GenICam stack. -
The wheel exists but pip still refuses it. Check for a
pipversion too old to understand the wheel's tags, and make sure you are not inside Cygwin or another unsupported toolchain.
Manual wheel install behind a restricted network
When the machine cannot reach PyPI directly:
- On a machine with access, download the wheel whose tag matches your interpreter and platform from the package's PyPI file page.
- Copy the file to the target machine.
- Install it directly:
pip install genicam-1.0.0-cp37-cp37m-win_amd64.whl(substituting your file's name). - Then install the rest of the stack:
pip install harvesters.
Use only files from the official package index. A rebuilt binary from an unknown source is an unvetted native library running inside your factory network.
Prevention checklist
- Record the interpreter version and bitness before starting any camera software install.
- Pin the acquisition environment's Python to a version the genicam package documents, and write the pin into the environment file.
- Keep acquisition dependencies in their own environment, isolated from the analysis stack.
- Prefer 64-bit interpreters everywhere; 32-bit hosts cannot use the GenICam binaries at all.
- Verify with one live frame from a real camera before calling the install complete.
If you are sizing the whole station, the system configurator walks camera, interface and host choices in order, and our support team can check an environment plan with you via the contact page.
Questions
Why does pip say no versions of genicam exist at all?
pip lists only the files it can actually install in your environment. If every published wheel targets a different Python version, architecture or platform, the list comes back empty and pip reports 'from versions: none'. The package exists; nothing in it matches your interpreter. Changing one of those three things — usually the Python version — makes the wheels reappear.
Which Python version should I pin for a GenICam acquisition stack?
Pin the newest version you can confirm has a genicam wheel on PyPI, then match your other imaging libraries to it. Historically each genicam release has supported a specific range of CPython versions, and support for a brand-new interpreter always arrives a release or two later. Check the package's PyPI file list before creating the environment rather than after a failed install.
Does 32-bit Python cause this error too?
Yes. GenICam reference implementation binaries are built for 64-bit architectures, so a 32-bit interpreter sees no compatible wheel even on a supported Python version. Run python -c "import struct; print(struct.calcsize('P')*8)" — it should print 64. If it prints 32, reinstall a 64-bit Python distribution and rebuild the environment.
How do I install the wheel manually behind a corporate proxy?
Download the wheel that matches your interpreter from the package's PyPI file page on a machine or browser with access, copy it over, and run pip install with the file path instead of the package name. Alternatively configure pip's proxy setting or an internal index so pip can reach PyPI itself. Use only the official PyPI files, never rebuilt binaries from unknown sources.
Can I keep my existing Python 3.8+ project and still acquire images?
Often yes. Keep the project on the new interpreter and put acquisition in a small helper process running the pinned environment, passing images over a queue, socket or shared memory. You get the newer language features in the analysis code while the GenICam stack stays on a version it supports. The split also isolates camera SDK crashes from your main application.

