Я создаю движок c ++ для доступа python через интерфейсы повышения для установки python3 .7. Это построение для:
Mac OS Mojave - 10.14.6
Python 3.7.4
Conda 4.8.3 (only crashes in a conda-built environment)
C++: clang version 11.0.0 (clang-1100.0.33.17)
Boost version 1.67.0
Код python не работает (насколько я могу судить) только в __init__
функциях с
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: __init__() should return None, not 'NoneType'
Другие отчеты о переполнении стека (см. Biblio ниже) и потоки github предполагают, что типичной проблемой является неправильная ссылка в .dylibs между python версиями или нет ответов. Но несовместимость dylib здесь, похоже, не так. otool -L (или ldd) указывает, что привязки библиотеки согласованы и все должно быть хорошо. Вот код и этапы сборки.
Минимальный код (с небольшой функцией проверки в python версии):
#include <iomanip>
#include <patchlevel.h>
#include <boost/python/def.hpp>
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
namespace R3 {
class DistanceType {
public:
DistanceType(double _val = 0) : val(_val) {}
double get() const { return val; }
void set(double _val) { val = _val; }
private:
double val;
};
void pyversion() {
int hexversion = PY_VERSION_HEX;
std::cout << "compiled with python version: " << PY_VERSION
<< " (hex version code) " << std::hex << std::setw(8) << hexversion << '\n';
}
}
BOOST_PYTHON_MODULE(simplepython) {
using namespace boost::python;
class_<R3::DistanceType>("DistanceType", init<double>())
.add_property("value", &R3::DistanceType::get, &R3::DistanceType::set)
;
boost::python::def("pyversion", R3::pyversion);
}
Вот результаты сборки и запуска кода:
>: g++ -I/opt/anaconda3/include/python3.7m -I/opt/anaconda3/include/python3.7m -O2 -fPIC -std=c++11 -Iinclude -c -o objs/simplepython.o src/simplepython.cpp
>: g++ -Wl,-rpath,/opt/anaconda3/lib -shared -o lib/simplepython.so objs/simplepython.o -L/opt/anaconda3/lib -Llib -lpython3.7m -ldl -framework CoreFoundation -lboost_python37 -lboost_numpy37
>: cd lib
>: python -c 'import simplepython as R3; R3.pyversion(); R3.DistanceType(1)'
compiled with python version: 3.7.4 (hex version code) 30704f0
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: __init__() should return None, not 'NoneType'
Библиографические отчеты о проблемах переполнения стека:
TypeError: __init __ () должен возвращать None, а не NoneType с Python Boost
Является ли ошибка Boost :: Python (Python 3.7) "__init __ () должна возвращать None, а не NoneType" проблема с линковкой?
Boost. Python __init __ () должен возвращать None, а не NoneType