jon_two
jon_two

Reputation: 1208

What is the best replacement for python setup.py install when Cython needs to be compiled?

With the latest version of setuptools, the python setup.py install command is being deprecated (see https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html for more info).

(venv) [jon@dev02 py38]$ python setup.py install
running install
/home/jon/.jenkins/workspace/Farm_revision_linux_py36/TOXENV/py38/venv/lib64/python3.8/site-
packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is 
deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
/home/jon/.jenkins/workspace/Farm_revision_linux_py36/TOXENV/py38/venv/lib64/python3.8/site-
packages/setuptools/command/easy_install.py:156: EasyInstallDeprecationWarning: easy_install 
command is deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
running bdist_egg
running egg_info
... etc

It is suggested that you can just pip install . to install a package from source, but this does not compile any Cython code. What is the best method for doing this?

The Cython docs are still recommending use of setup.py and I can't find any better suggestions. It appears that a developer install (pip install -e .) does compile the Cython files, or you can python setup.py build_ext --inplace after running pip install .. Neither of these options are ideal, so I would like to know if there is a suggested alternative.

EDIT:

The package setup.py file contains this code, which should compile the Cython files:

try:
    import numpy
    from Cython.Build import cythonize
    cython_files = ["farm/rasters/water_fill.pyx"]
    cython_def = cythonize(cython_files, annotate=True,
                           compiler_directives={'language_level': str(sys.version_info.major)})
    include_dirs = [numpy.get_include()]
except ImportError:
    cython_def = None
    include_dirs = None

When installing with python setup.py install, the farm/rasters directory contains the following files:

water_fill.c
water_fill.cpython-38-x86_64-linux-gnu.so
water_fill.html
water_fill.pyx

When installing with pip install ., the directory does not contain the .so file and when we try and run water_fill tests, we get errors like this

________________________________ TestFlowDown1D.test_distribute_1d_trough_partial_3 _________________________________
farm/rasters/tests/test_flood_enhance.py:241: in test_distribute_1d_trough_partial_3
    actual_arr = water_fill.water_fill_1d(arr, additional_value)
E   AttributeError: 'NoneType' object has no attribute 'water_fill_1d'

Upvotes: 25

Views: 19772

Answers (1)

Marc Morcos
Marc Morcos

Reputation: 158

I believe the warning should go away if you keep the setup.py but add a pyproject.toml. This is described in https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html .

Here is the example pyproject.toml file they give:

[build-system]
requires = ["setuptools", "wheel", "Cython"]

Upvotes: 4

Related Questions