Создайте exe-файл проекта python pypylon, используя файл спецификаций pyinstaller - PullRequest
0 голосов
/ 17 мая 2018

В моем проекте на python я использовал Ethernet-камеры Basler GigE Vision, поскольку pylon не поддерживает python, тогда я использовал pypylon.pylon wrapper , чтобы открыть его в python.Это мой класс, чтобы открыть камеру, но после создания исполняемого файла я получаю ошибки при ее открытии. Я использовал spec-файл для работы с pyinstaller. Я получаю следующие ошибки:

import pypylon.pylon as py
import numpy as np


class PylonVideoReader:

def __init__(self, deviceName=None):
    self.deviceName = deviceName
    tlfactory = py.TlFactory.GetInstance()
    if not self.deviceName is None:
        deviceInfoList = tlfactory.EnumerateDevices()
        deviceIndex = None
        for i in range(len(deviceInfoList)):
            if self.deviceName == deviceInfoList[i].GetUserDefinedName():
                deviceIndex = i
                break

        if deviceIndex is None:
            print("Device: {} not found please ensure that it is "
                  "connected".format(self.deviceName))
            exit()
        else:
            # Create new camera
            self.camera = py.InstantCamera(tlfactory.CreateDevice(
                deviceInfoList[deviceIndex]))
    else:
        # Create new camera
        self.camera = py.InstantCamera(tlfactory.CreateFirstDevice())

    # Open camera
    self.camera.Open()
    # Set max number of frame buffers
    self.camera.MaxNumBuffer = 50
    # Initialize the  image format converter
    self.formatConverter = py.ImageFormatConverter()
    # Set output pixel format to BGR8 for opencv
    self.formatConverter.OutputPixelFormat = py.PixelType_BGR8packed

    # Start grabbing process
    self.camera.StartGrabbing(py.GrabStrategy_LatestImageOnly)
    # Grab a first image to get its size
    grabResult = self.camera.RetrieveResult(10000)
    # Stop grabbing process
    # self.camera.StopGrabbing()

    # Get dimensions of image
    self.frameWidth = grabResult.GetWidth()
    self.frameHeight = grabResult.GetHeight()

def get(self, code):
    if code == 3:
        return self.frameWidth
    elif code == 4:
        return self.frameHeight
    else:
        print("{} is not a known property code".format(code))

def read(self):
    # try:

    # Start grabing process
    # self.camera.StartGrabbing(py.GrabStrategy_LatestImageOnly)
    # Grab an image
    grabResult = self.camera.RetrieveResult(10000)
    # Stop grabing process
    # self.camera.StopGrabbing()
    # Get dimensions of image
    self.frameWidth = grabResult.GetWidth()
    self.frameHeight = grabResult.GetHeight()

    if grabResult.GrabSucceeded():
        # Convert Grab result from YUV422 to BGR8
        pylonImage = self.formatConverter.Convert(grabResult)
        # Convert pylon image to opencv image
        # image = np.frombuffer(bytearray(pylonImage.GetBuffer()), np.uint8)
        image = np.asarray(bytearray(pylonImage.GetBuffer()), np.uint8)
        image = image.reshape(self.frameHeight, self.frameWidth, 3)

        return (True, image)
    # except :
    return (False, None)

def release(self):
    self.camera.StopGrabbing()
    self.camera.Close()

основной код:

if __name__ == "__main__":    
    cap = PylonVideoReader("Admin1")
    cv2.namedWindow("Test1", cv2.WINDOW_NORMAL)
    while True:
        ret, image = cap.read()                
        if ret:
            cv2.imshow("Test1", image)
        if cv2.waitKey(1) % 256 == ord('q'):
            break

Traceback (последний вызовпоследнее): файл "site-packages \ pypylon \ pylon.py", строка 42, в файле swig_import_helper
Файл "importlib__init__.py", строка 126, в файле import_module "", строка 994, в файле _gcd_import "", строка971, в _find_and_load File "", строка 953, в _find_and_load_unlocked ModuleNotFoundError: нет модуля с именем 'pypylon._pylon'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "MainGuiLogic.py", строка 18, в файле "c: \ programdata \ anaconda3 \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py", строка 631, в файле exec_moduleexec (байт-код, модуль. dict ) Файл "PylonVideoReader.py", строка 1, в файле "c: \ programdata \ anaconda3 \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py", строка631, в exec_module exec (байт-код, модуль. dict ) Файл "site-packages \ pypylon \ pylon.py", строка 45, в файле "site-packages \ pypylon \ pylon.py", строка 44, в swig_import_helper
Файл "importlib__init__.py", строка 126,в файле import_module "c: \ programdata \ anaconda3 \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py", строка 714, в модуле load_module = loader.load_module (полное имя) ModuleNotFoundError: нет модуля с именем 'pypylon._genicam ' [4300] Не удалось выполнить скрипт MainGuiLogic [4300] ПОГРУЗЧИК: ОК.[4300] ПОГРУЗЧИК: Очистка интерпретатора Python.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

После создания исполняемых файлов с помощью pyinstaller ( Как создать исполняемый файл с помощью pyinstaller ) вы должны найти папку pypylon из вашей виртуальной среды, которая использовалась в проекте, и скопировать папку pypylon рядом с exe-файлом.

0 голосов
/ 06 декабря 2018

Мне удалось обойти эту проблему, выполнив следующие действия: некоторые шаги могут не понадобиться, но до сих пор это работало в моем случае.Я нашел эту проблему github полезной и поставил меня на правильный путь.

Во-первых, чрезмерный импорт в моем скрипте:

import pypylon
from pypylon import pylon
from pypylon import genicam
from pypylon import _genicam
from pypylon import _pylon

Я бы посоветовал против путивы импортировали pypylon в своем примере, поэтому ссылка на пакет просто как «py» будет сбивать с толку других разработчиков.

Затем я изменил спецификации моего файла binaries, pathex и hiddenimports.Я добавил все файлы pylon dll и pyd в binaries, добавил каталог pypylon в pathex и добавил все возможности в hiddenimports:

import pypylon
pypylon_dir = pathlib.Path(pypylon.__file__).parent
pypylon_dlls = [(str(dll), '.') for dll in pypylon_dir.glob('*.dll')]
pypylon_pyds = [(str(dll), '.') for dll in pypylon_dir.glob('*.pyd')]

_binaries = list()
_binaries.extend(pypylon_dlls)
_binaries.extend(pypylon_pyds)

_pathex = list()
_pathex.append(str(pypylon_dir))

_hiddenimports = list()
_hiddenimports.extend(['pypylon', 'pypylon.pylon', 'pypylon.genicam', 'pypylon._pylon', 'pypylon._genicam'])

a = Analysis(...
             pathex=_pathex,
             binaries=_binaries,
             ...
             hiddenimports=_hiddenimports,

Я не уверен, что всеэто строго необходимо, но у меня это работает с Python 3.4, PyInstaller 3.3 и pypylon 1.3.1.

Удачи!

...