code: def test_cython_api(tmpdir):
      """
      Basic test for the Cython API.
      """
      # Fail early if cython is not found
      import cython  # noqa
  
      with tmpdir.as_cwd():
          # Set up temporary workspace
          pyx_file = "pyarrow_cython_example.pyx"
          shutil.copyfile(
              os.path.join(here, pyx_file),
              os.path.join(str(tmpdir), pyx_file),
          )
          # Create setup.py file
          setup_code = setup_template.format(
              pyx_file=pyx_file,
              compiler_opts=compiler_opts,
              test_ld_path=test_ld_path,
          )
          with open("setup.py", "w") as f:
              f.write(setup_code)
  
          # ARROW-2263: Make environment with this pyarrow/ package first on the
          # PYTHONPATH, for local dev environments
          subprocess_env = test_util.get_modified_env_with_pythonpath()
  
          # Compile extension module
          subprocess.check_call(
              [sys.executable, "setup.py", "build_ext", "--inplace"],
              env=subprocess_env,
          )
  
          # Check basic functionality
          orig_path = sys.path[:]
          sys.path.insert(0, str(tmpdir))
          try:
              mod = __import__("pyarrow_cython_example")
              check_cython_example_module(mod)
          finally:
              sys.path = orig_path
  
          # Check the extension module is loadable from a subprocess without
          # pyarrow imported first.
          code = """if 1:
              import sys
              import os
  
              try:
                  # Add dll directory was added on python 3.8
                  # and is required in order to find extra DLLs
                  # only for win32
                  for dir in {library_dirs}:
                      os.add_dll_directory(dir)
              except AttributeError:
                  pass
  
              mod = __import__({mod_name!r})
              arr = mod.make_null_array(5)
              assert mod.get_array_length(arr) == 5
              assert arr.null_count == 5
          """.format(
              mod_name="pyarrow_cython_example",
              library_dirs=pa.get_library_dirs(),
          )
  
          path_var = None
          if sys.platform == "win32":
              if not hasattr(os, "add_dll_directory"):
                  # Python 3.8 onwards don't check extension module DLLs on path
                  # we have to use os.add_dll_directory instead.
                  delim, path_var = ";", "PATH"
          elif sys.platform == "darwin":
              delim, path_var = ":", "DYLD_LIBRARY_PATH"
          else:
              delim, path_var = ":", "LD_LIBRARY_PATH"
  
          if path_var:
              paths = sys.path
              paths += pa.get_library_dirs()
              paths += [subprocess_env.get(path_var, "")]
              paths = [path for path in paths if path]
              subprocess_env[path_var] = delim.join(paths)
          subprocess.check_call(
              [sys.executable, "-c", code],
              stdout=subprocess.PIPE,
              env=subprocess_env,
          )
  
file_path: arrow/python/pyarrow/tests/test_cython.py
imports: import os
  import shutil
  import subprocess
  import sys
  import pytest
  import pyarrow
  import pyarrow.tests.util
label_desc: Use image node_id 2 for calling a global function with example usage: test_cython_api(tmpdir) without return types