файл pyd не может найти numpy в Python 3.11 и Windows 11

Вопрос или проблема

Я скомпилировал файл submodule.pyx в submodule.cp311-win_amd64.pyd с помощью cython 3.0.8. Затем я использовал pyInstaller 6.11.0, чтобы создать appx.exe. Но затем appx.exe сообщил, что не может найти numpy, который импортирован в submodule.pyx. Любая помощь будет очень полезна. Моя структура файлов следующая.

.
├── src
│   ├── __init__.py 
│   └── submodule.pyx
├── README.txt
├── setup.py 
└── appx.py

appx.py выглядит следующим образом.

from src import submodule   
subObj = submodule.runApp() 

setup.py выглядит следующим образом.

# setup.py
from setuptools import find_packages, setup
from setuptools.extension import Extension

from Cython.Build import cythonize
from Cython.Distutils import build_ext

setup(
    name="appx",
    version='1.37.41',
    ext_modules = cythonize(
        [
            Extension("src.submodule", ["src/submodule.pyx"]),
        ],
        build_dir="build_cythonize",
        compiler_directives={
            'language_level' : "3",
            'always_allow_keywords': True,
        }
    ),
    cmdclass=dict(
        build_ext=build_ext
    ),
)

Файл __init__.py выглядит следующим образом. Поскольку я не уверен, может ли pyinstaller найти все зависимости в submodule.pyd, я перечислил все операторы импорта всех этих основных модулей в этом файле.

# Примечание! Не должно быть никаких переменных модуля в CnUtil. 
from __future__ import print_function    # (вверху модуля)
import sys 

if sys.version_info[0] < 3: # Python 2 и 3:

    # Чтобы выполнить файл, введите следующую команду в powershell: 
    # % python CnTestDragonPackage.py build_ext --inplace
    import future        # pip install future
    import builtins      # pip install future
    import past          # pip install future
    import six           # pip install six

from submodule import runApp 

import numpy
import cv2
import base64
import wx
import os
import string
import random
import math
import copy
import subprocess
import json
import threading
import datetime
import shutil

Затем я выполнил следующие команды поочередно в папке с app.py.

conda activate myCondaEnv311_Windows
python setup.py build_ext --inplace

Затем я увидел, что файл submodule.cp311-win_amd64.pyd появился в папке

./src

Затем я выполнил следующую команду, чтобы использовать pyInstaller для упаковки.

pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" appx.py

После этого я увидел, что структура файлов расширилась следующим образом.

.
├── src
│   ├── __init__.py 
│   └── submodule.pyx
├── build
├── build_cythonize
├── dist
│   └── appx
│       ├── _internal 
│       └── appx.exe
├── README.txt
├── setup.py 
└── appx.py

Затем я сменил директорию на ./dist/appx и набрал appx.exe.
Но он прервался с выводом команды:

Нет модуля с именем 'numpy'

Может кто-то подскажет, как сделать это правильно?
Любые предложения будут очень полезны.

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что ваш компилированный модуль submodule.pyd не может найти библиотеку NumPy при запуске сгенерированного исполняемого файла appx.exe, созданного с помощью PyInstaller. Давайте рассмотрим возможные причины и решения данной проблемы.

1. Убедитесь, что NumPy установлен

Прежде всего, убедитесь, что библиотека NumPy действительно установлена в вашей активированной среде Conda. Вы можете проверить это, активировав свою среду и выполнив следующую команду:

conda list numpy

Если NumPy не установлен, вы можете установить его с помощью следующей команды:

conda install numpy

2. Используйте PyInstaller правильно для указания зависимостей

PyInstaller может не обнаружить зависимости автоматически. Чтобы убедиться, что NumPy будет включен в сгенерированный пакет, добавьте его в опции командной строки PyInstaller. Вы можете сделать это, используя флаг --hidden-import. Обновите команду сборки следующим образом:

pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" --hidden-import=numpy appx.py

3. Проверка файла spec

Когда PyInstaller создаёт исполняемый файл, он создаёт файл спецификации (spec файл), в котором указаны все зависимости. Проверьте этот файл, чтобы убедиться, что NumPy включен в список. Вы можете создать файл спецификации с помощью следующей команды:

pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" --hidden-import=numpy --onefile --collect-all numpy appx.py --debug all

После этого, откройте созданный файл appx.spec и убедитесь, что NumPy включен в секцию Analysis.

4. Убедитесь, что структура пакета корректна

Иногда проблемы могут возникать из-за неправильной структуры папок или путей. Убедитесь, что все зависимые файлы, в том числе динамические библиотеки, которые могут использовать NumPy, находятся в правильных директориях.

5. Проверьте PATH и PYTHONPATH

Убедитесь, что переменные среды PATH и PYTHONPATH правильно настроены и указывают на вашу среду, где установлен Python и NumPy. Эта ошибка может возникнуть, если рабочая директория не содержит нужных библиотек.

6. Логирование ошибок

При запуске appx.exe с флагом --debug вы сможете увидеть более подробные сообщения об ошибках, которые могут помочь диагностировать проблему.

Итоговые шаги

Если после выполнения всех вышеуказанных шагов проблема не решена, рассмотрите возможность:

  • Создания нового виртуального окружения и повторной установки всех зависимостей.
  • Переустановки PyInstaller и Cython.
  • Проверки, являются ли все используемые вами версии библиотек совместимыми.

Эти шаги должны помочь вам успешно подготовить ваш проект для работы и устранить ошибку No module named 'numpy'. Если возникнут новые вопросы, не стесняйтесь спрашивать.

Оцените материал
Добавить комментарий

Капча загружается...