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 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.
/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ą?)
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.
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();
)?numpy.py
?