Для простоты я дам вам, ребята, мой .pyx.
У меня есть файл Geometry.pyx, и в этом файле есть классы Segment, Angle и Circle.
cimport Geometry
# Define Python classes
cdef class Segment:
def __cinit__(self, float length):
self.c_segment = make_shared[_Segment](length)
def get_length(self) -> float:
return self.c_segment.get().get_length()
cdef class Angle:
def __cinit__(self, float degrees):
self.c_angle = make_shared[_Angle](degrees)
def get_degrees(self) -> float:
return self.c_angle.get().get_degrees()
def get_radians(self) -> float:
return self.c_angle.get().get_radians()
cdef class Circle:
def __cinit__(self, float radius):
self.c_circle = make_shared[_Circle](radius)
def get_radius(self) -> float:
return self.c_circle.get().get_radius()
def get_diameter(self) -> float:
return self.c_circle.get().get_diameter()
def get_area(self) -> float:
return self.c_circle.get().get_area()
def get_perimeter(self) -> float:
return self.c_circle.get().get_perimeter()
Как мне написать файл setup.py?
Я написал, как показано ниже, но получил ошибку
from setuptools import setup, Extension, find_packages
from Cython.Build import cythonize
# extension = Extension(
# "Geometry.Geometry",
# ["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
# include_dirs=["../cpp/lib/include"],
# extra_compile_args=['-std=c++17', '-O3'],
# language='c++'
# )
extension_segment = Extension(
"Geometry.Segment",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
extension_angle= Extension(
"Geometry.Angle",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
extension_circle= Extension(
"Geometry.Circle",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
setup(
name='Geometry',
version='0.1',
packages=find_packages(where='src'),
package_dir={"": "src"},
package_data={"Geometry": ["*.pyx"]},
ext_modules=cythonize(extension_segment,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)+
cythonize(extension_angle,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)+
cythonize(extension_circle,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)
)
Test.py
from Geometry import Segment, Angle, Circle
class TestGeometry:
def test_segment_length(self):
seg = Segment(10.0)
# assert seg.get_length() == 5.0
print("HELO")
#
# def test_angle_degrees(self):
# ang = Angle(90.0)
# assert ang.get_degrees() == 90.0
#
# def test_angle_radians(self):
# ang = Angle(90.0)
# assert ang.get_radians() == 1.5707963267948966 # approximately pi/2
#
# def test_circle_radius(self):
# circ = Circle(3.0)
# assert circ.get_radius() == 3.0
#
# def test_circle_diameter(self):
# circ = Circle(3.0)
# assert circ.get_diameter() == 6.0
#
# def test_circle_area(self):
# circ = Circle(3.0)
# assert circ.get_area() == 28.274333882308138 # approximately pi * r^2
#
# def test_circle_perimeter(self):
# circ = Circle(3.0)
# assert circ.get_perimeter() == 18.84955592153876 # approximately 2 * pi * r
Сообщение об ошибке
/home/punreach/Desktop/A_Folder/project-core/venv/bin/python /opt/pycharm-2024.1/plugins/python/helpers/pycharm/_jb_pytest_runner.py --target test_geometry.py::TestGeometry.test_segment_length
Testing started at 오후 6:11 ...
Launching pytest with arguments test_geometry.py::TestGeometry::test_segment_length --no-header --no-summary -q in /home/punreach/Desktop/A_Folder/project-core/lib/Geometry/cython/test
============================= test session starts ==============================
collecting ...
test/test_geometry.py:None (test/test_geometry.py)
test_geometry.py:1: in
from Geometry import Segment, Angle, Circle
../../../../venv/lib/python3.10/site-packages/Geometry-0.1-py3.10-linux-x86_64.egg/Geometry/__init__.py:1: in
from .Geometry import *
src/Geometry/Geometry.pyx:1: in init Geometry.Geometry
???
E AttributeError: partially initialized module 'Geometry' has no attribute 'Segment' (most likely due to a circular import)
collected 0 items / 1 error
=============================== 1 error in 0.02s ===============================
ERROR: found no collectors for /home/punreach/Desktop/A_Folder/project-core/lib/Geometry/cython/test/test_geometry.py::TestGeometry::test_segment_length
Process finished with exit code 4
Подробнее здесь: https://stackoverflow.com/questions/783 ... e-pyx-file
Cython: как я могу импортировать несколько классов или объектов из одного файла .pyx ⇐ C++
Программы на C++. Форум разработчиков
1713691090
Anonymous
Для простоты я дам вам, ребята, мой .pyx.
У меня есть файл Geometry.pyx, и в этом файле есть классы Segment, Angle и Circle.
cimport Geometry
# Define Python classes
cdef class Segment:
def __cinit__(self, float length):
self.c_segment = make_shared[_Segment](length)
def get_length(self) -> float:
return self.c_segment.get().get_length()
cdef class Angle:
def __cinit__(self, float degrees):
self.c_angle = make_shared[_Angle](degrees)
def get_degrees(self) -> float:
return self.c_angle.get().get_degrees()
def get_radians(self) -> float:
return self.c_angle.get().get_radians()
cdef class Circle:
def __cinit__(self, float radius):
self.c_circle = make_shared[_Circle](radius)
def get_radius(self) -> float:
return self.c_circle.get().get_radius()
def get_diameter(self) -> float:
return self.c_circle.get().get_diameter()
def get_area(self) -> float:
return self.c_circle.get().get_area()
def get_perimeter(self) -> float:
return self.c_circle.get().get_perimeter()
Как мне написать файл setup.py?
Я написал, как показано ниже, но получил ошибку
from setuptools import setup, Extension, find_packages
from Cython.Build import cythonize
# extension = Extension(
# "Geometry.Geometry",
# ["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
# include_dirs=["../cpp/lib/include"],
# extra_compile_args=['-std=c++17', '-O3'],
# language='c++'
# )
extension_segment = Extension(
"Geometry.Segment",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
extension_angle= Extension(
"Geometry.Angle",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
extension_circle= Extension(
"Geometry.Circle",
["src/Geometry/Geometry.pyx", "../cpp/lib/src/Geometry.cpp"],
include_dirs=["../cpp/lib/include"],
extra_compile_args=['-std=c++17', '-O3'],
language='c++'
)
setup(
name='Geometry',
version='0.1',
packages=find_packages(where='src'),
package_dir={"": "src"},
package_data={"Geometry": ["*.pyx"]},
ext_modules=cythonize(extension_segment,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)+
cythonize(extension_angle,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)+
cythonize(extension_circle,
compiler_directives={'language_level': 3},
include_path=["src/Geometry"],
annotate=True
)
)
Test.py
from Geometry import Segment, Angle, Circle
class TestGeometry:
def test_segment_length(self):
seg = Segment(10.0)
# assert seg.get_length() == 5.0
print("HELO")
#
# def test_angle_degrees(self):
# ang = Angle(90.0)
# assert ang.get_degrees() == 90.0
#
# def test_angle_radians(self):
# ang = Angle(90.0)
# assert ang.get_radians() == 1.5707963267948966 # approximately pi/2
#
# def test_circle_radius(self):
# circ = Circle(3.0)
# assert circ.get_radius() == 3.0
#
# def test_circle_diameter(self):
# circ = Circle(3.0)
# assert circ.get_diameter() == 6.0
#
# def test_circle_area(self):
# circ = Circle(3.0)
# assert circ.get_area() == 28.274333882308138 # approximately pi * r^2
#
# def test_circle_perimeter(self):
# circ = Circle(3.0)
# assert circ.get_perimeter() == 18.84955592153876 # approximately 2 * pi * r
Сообщение об ошибке
/home/punreach/Desktop/A_Folder/project-core/venv/bin/python /opt/pycharm-2024.1/plugins/python/helpers/pycharm/_jb_pytest_runner.py --target test_geometry.py::TestGeometry.test_segment_length
Testing started at 오후 6:11 ...
Launching pytest with arguments test_geometry.py::TestGeometry::test_segment_length --no-header --no-summary -q in /home/punreach/Desktop/A_Folder/project-core/lib/Geometry/cython/test
============================= test session starts ==============================
collecting ...
test/test_geometry.py:None (test/test_geometry.py)
test_geometry.py:1: in
from Geometry import Segment, Angle, Circle
../../../../venv/lib/python3.10/site-packages/Geometry-0.1-py3.10-linux-x86_64.egg/Geometry/__init__.py:1: in
from .Geometry import *
src/Geometry/Geometry.pyx:1: in init Geometry.Geometry
???
E AttributeError: partially initialized module 'Geometry' has no attribute 'Segment' (most likely due to a circular import)
collected 0 items / 1 error
=============================== 1 error in 0.02s ===============================
ERROR: found no collectors for /home/punreach/Desktop/A_Folder/project-core/lib/Geometry/cython/test/test_geometry.py::TestGeometry::test_segment_length
Process finished with exit code 4
Подробнее здесь: [url]https://stackoverflow.com/questions/78360988/cython-how-can-i-import-multiple-class-or-object-from-a-single-pyx-file[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия