#python #cython #cythonize
Вопрос:
Я пытаюсь установить пакет, в котором некоторые файлы созданы с помощью Cython. Моя setup.py
внешность похожа:
import os from setuptools import setup from setuptools.command.build_py import build_py as _build_py from Cython.Build import cythonize def readme(): with open('README.md') as f: return f.read() with open("requirements.txt", "r") as fh: requirements = fh.readlines() def get_ext_paths(root_dir): """get filepaths for compilation""" paths = [] for root, dirs, files in os.walk(root_dir): if root.startswith("mypkg/dir1") or root.startswith("mypkg/dir2") or root.startswith("mypkg/dir3"): continue for filename in files: if os.path.splitext(filename)[1] != '.py': continue file_path = os.path.join(root, filename) paths.append(file_path) return paths # noinspection PyPep8Naming class build_py(_build_py): def find_package_modules(self, package, package_dir): ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') modules = super().find_package_modules(package, package_dir) filtered_modules = [] for (pkg, mod, filepath) in modules: if os.path.exists(filepath.replace('.py', ext_suffix)): continue filtered_modules.append((pkg, mod, filepath, )) return filtered_modules setup(name='my-pkg', version='0.1', description='My description', long_description=readme(), classifiers=[ 'Development Status :: 3 - Alpha', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3.0', 'Topic :: Scientific/Engineering', ], keywords='my-keyword', url='https://github.com/MyProject/mypkg', author='First Last', author_email='firstlast@example.com', license='MIT', packages=['mypkg', 'mypkg.dir0', 'mypkg.dir1', 'mypkg.dir2', 'mypkg.dir3', 'mypkg.dir3.dir4'], ext_modules=cythonize(get_ext_paths('mypkg'), compiler_directives={'language_level': 3}), install_requires=[req for req in requirements if req[:2] != "# "], include_package_data=True, zip_safe=False)
Я могу установить версию Python с помощью
pip install .
Однако, независимо от того , что я запускаю для сборки setup.py
, я не могу сделать версию Cython видимой за пределами пакета.
Например, внутри папок пакетов, когда я запускаю:
from mypkg import MyClass print(MyClass.mymethod)
Я получаю:
lt;cyfunction MyClass.mymethod at 0x7ff2f4ef65f0gt;
Но как только я выхожу из корневого каталога, я получаю
lt;function MyClass.mymethod at 0x7f62b77c78b0gt;
Я пытался
pip install .
python setup.py install
python setup.py build_ext --inplace
python setup.py build_ext --inplace pip install .
python setup.py bdist_wheel pip install dist/my_pkg-0.1-cp38-cp38-linux_x86_64.whl
Было бы здорово получить некоторое представление о последовательности команд, необходимых для установки версии Cython.
Комментарии:
1. Не могли бы вы уточнить, что вы подразумеваете под «Я не могу сделать версию Cython видимой за пределами пакета»?
MyClass.mymethod
Предполагается, что это метод, который возвращает версию Cython? Если это так, вы забываете назвать это: попробуйтеprint(MyClass.mymethod())
2. Я просто имел в виду это как способ проверить, запущена ли версия Python или версия Cython. Внутри корневого каталога при печати объекта функции тип выводится непосредственно как функция, но снаружи тип-это просто функция. В любом случае, код запускается, я думаю, что он просто использует медленную версию.