Traceback (most recent call last):                                                                                                                    
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/__init__.py", line 17, in <module>                                                          
    from . import multiarray                                                                                                                          
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/multiarray.py", line 14, in <module>                                                        
    from . import overrides                                                                                                                           
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/overrides.py", line 7, in <module>                                                          
    from numpy.core._multiarray_umath import (                                                                                                        
ImportError: /usr/local/lib/python3.5/dist-packages/numpy/core/_multiarray_umath.cpython-35m-x86_64-linux-gnu.so: undefined symbol: PyExc_RecursionError                                                                                                                                                    

During handling of the above exception, another exception occurred:                                                                                   

Traceback (most recent call last):                                                                                                                    
  File "<string>", line 1, in <module>                                                                                                                
  File "/usr/local/lib/python3.5/dist-packages/numpy/__init__.py", line 142, in <module>                                                              
    from . import core
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/__init__.py", line 47, in <module>
    raise ImportError(msg)
ImportError: 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy c-extensions failed.
- Try uninstalling and reinstalling numpy.
- If you have already done that, then:
  1. Check that you expected to use Python3.5 from "/usr/bin/python3",
     and that you have no directories in your PATH or PYTHONPATH that can
     interfere with the Python and numpy version "1.17.4" you're trying to use.
  2. If (1) looks fine, you can open a new issue at
     https://github.com/numpy/numpy/issues.  Please include details on:
     - how you installed Python
     - how you installed numpy
     - your operating system
     - whether or not you have multiple versions of Python installed
     - if you built from source, your compiler versions and ideally a build log

- If you're working with a numpy git repository, try `git clean -xdf`
  (removes all files not under version control) and rebuild numpy.

Note: this error has many possible causes, so please don't comment on
an existing issue about this - open a new one instead.

Original error was: /usr/local/lib/python3.5/dist-packages/numpy/core/_multiarray_umath.cpython-35m-x86_64-linux-gnu.so: undefined symbol: PyExc_RecursionError

Ten błąd pojawia się podczas uruchamiania kodu w języku Python w C ++ przy użyciu interfejsu API cpython. Plik Pythona po prostu importuje numpy. Czy ktoś wie, co może być możliwym problemem i jego rozwiązaniem?

Próbowałem wielu różnych instalacji Pythona, kompilując je ze źródła, ale wydaje się, że nie ma to żadnego efektu. Obecnie w systemie mam zainstalowane tylko python3.5 i python3.5m. Są to domyślne instalacje języka Python dostarczone z systemem (ubuntu 16.04).

Poniżej znajduje się plik cmake:

cmake_minimum_required(VERSION 2.8)
project(testproject C CXX)


set (CMAKE_CXX_STANDARD 14)
set(CMAKE_VERBOSE_MAKEFILE OFF)

set(CMAKE_JS_INC "$ENV{HOME}/.cmake-js/node-x64/v10.15.3/include/node;/home/project/code/node_modules/nan")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Release)

#------ PACKAGES ------
find_package(OpenCV 3 REQUIRED)
#---------------------------


#------ CORE ----
file(GLOB SOURCE_FILES "src/*.cpp" "src/*.h" "nan/*.cpp" "nan/*.h"
    "drivers/*.cpp" "drivers/*.h"
    "drivers/webstream/*.cpp" "drivers/webstream/*.h"
    )

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC}
    PUBLIC "."
    )

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
#---------------------------


#------ EVAL PACKAGES ------
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
#---------------------------
# c-python config
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/include/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/lib/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/local/lib/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/local/lib/python3.5/dist-packages/numpy/core/include/")
add_library(python_c SHARED IMPORTED)
set_target_properties(python_c PROPERTIES IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libpython3.5m.so")

target_link_libraries(
        ${PROJECT_NAME}
        PUBLIC python_c
)


#add_executable
add_executable(code pawan.cpp)
target_link_libraries(code
        PUBLIC python_c
        PUBLIC ${OpenCV_LIBS})

Polecenie dla cmake to:

cmake -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3.5 ..

Za pomocą cmake stworzyłem również plik wykonywalny „kod”. Plik wykonywalny działa poprawnie. Błąd pojawia się podczas używania kodu za pośrednictwem biblioteki utworzonej za pomocą cmake.

To jest plik pawan.cpp

#include "python3.5/Python.h"
#include <iostream>
#include <string>

using namespace std;

void fun() {
    cout << "using cpython......................................................................00" << endl;
    Py_Initialize();
    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11')");
//    if(PyArray_API == NULL){
//        _import_array();
//    }
    PyRun_SimpleString ("import numpy; print(numpy.__file__)");

    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^22')");
}
-1
Pawan 20 listopad 2019, 17:23
Witamy w Stackoverflow! Opisz, jak już próbowałeś rozwiązać problem. Czy wypróbowałeś wszystkie sugestie wymienione w komunikacie o błędzie?
 – 
squareskittles
20 listopad 2019, 17:28
Zaktualizowałeś pytanie zgodnie z sugestią.
 – 
Pawan
20 listopad 2019, 17:33
PyExc_RecursionError oznacza, że ​​funkcja (być może import w tym przypadku) wywołuje samą siebie i robi to „zbyt wiele” razy. Czy importujesz numpy niezależnie za pomocą pybind11 (pybind11::module::import("numpy")) przed uruchomieniem innego kodu? Jeśli nie, czy wywołujesz inicjalizację numpy'ego (import_array();)?
 – 
Wim Lavrijsen
20 listopad 2019, 20:26
Czy to możliwe, że Ty też nazwałeś plik numpy.py?
 – 
arrowd
21 listopad 2019, 09:40
Oba powyższe powodują ten sam błąd. @WimLavrijsen
 – 
Pawan
21 listopad 2019, 10:32

1 odpowiedź

Dzięki za pełny plik cmake. W tym miejscu aplikacja, którą tworzysz, zawiera i łączy z Pythonem 3.5. Błąd z numpy pochodzi jednak z _multiarray_umath.cpython-38-x86_64-linux-gnu.so, więc został skompilowany dla Python3.8 i przypuszczalnie jest pobierany b / c jest to wersja Pythona obecnie w twoim środowisku. Kompilacje rozszerzeń C dla różnych wersji CPythona są generalnie niekompatybilne.

Chyba że masz konkretną potrzebę Pythona 3.5, w takim przypadku polecam upewnić się, że jest poprawnie skonfigurowany w Twoim środowisku (tj. Wskazując PATH i LD_LIBRARY_PATH na wersje Python 3.5) i najpierw zainstalował numpy. Ale jeśli wystarczy 3.8, możesz po prostu pozwolić cmake odebrać go ze środowiska. Coś takiego:

find_package(PythonInterp)

if (PYTHONINTERP_FOUND)
   execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys;sys.stdout.write(sys.version[:3])"
                   OUTPUT_VARIABLE PYTHON_VERSION)
   execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys;sys.stdout.write(sys.prefix)"
                   OUTPUT_VARIABLE PYTHON_PREFIX)
   set (CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${PYTHON_PREFIX})
endif()

set(Python_ADDITIONAL_VERSIONS ${PYTHON_VERSION})
find_package(PythonLibs REQUIRED)

if (NOT PYTHONLIBS_FOUND)
   message(FATAL_ERROR "PythonLibs package not found and python component required")
endif()

Dodaj "${PYTHON_INCLUDE_PATH}" do projektu obejmuje i "{$PythonLibs}", z którym chcesz połączyć swój cel.

0
Wim Lavrijsen 21 listopad 2019, 18:13
Przepraszam za problem. Zaktualizowałem pytanie. Wcześniej dodałem błąd, który pojawił się, gdy próbowałem z python3.8 i plikiem cmakelists.txt, który dodałem później, a wtedy próbowałem python3.5. Zaktualizowałem pytanie i używa python3.5m, a błąd nadal się pojawia. Numpy, które wybiera, to również python3.5m. Całkowicie przełączyłem się na cpython api i nadal nie działa. Wszelkie komentarze byłyby bardzo pomocne. Czekam na odpowiedź. Dzięki.
 – 
Pawan
22 listopad 2019, 10:14
Szczerze mówiąc, wciąż obstawiam, że mieszasz dwa pytony (3,5 i 3,5), ponieważ wybierasz dołączenia i biblioteki z kombinacji /usr i /usr/local. Co pokazuje ten python -c "import distutils.sysconfig as sc; print(sc.get_config_var('INCLDIRSTOMAKE'))"? (tj. czy katalogi się zgadzają?)
 – 
Wim Lavrijsen
23 listopad 2019, 03:02
Dzięki za pomoc. Dowiedziałem się, że jest jakiś problem z łączem. Rozwiązanie w tym łączu pracował dla mnie.
 – 
Pawan
25 listopad 2019, 13:23