Nonetype не может быть вызван из joblib, когда требуется (но не используется) cv2

Эта ошибка довольно странная, всякий раз, когда я использую Kmeans of sklearn с n_jobs> 1 в модульном тесте, и при использовании cv2 с помощью setuptools приводит к вызову None из joblib.

Минимальный неудачный пример:

setup.py:

from setuptools import setup

setup(
    name = "libbla",
# Removing "cv2" resolves the issue :S
    install_requires = ["numpy", "scikit-learn", "cv2"],
    test_suite = 'tests'
)

tests/some_test.py:

from sklearn.cluster import KMeans

# also fails without importing sklearn and cv2, just want them for the version numbers.
import unittest, numpy, sklearn, cv2

print("cv2", cv2.__version__)
print("np", numpy.__version__)
print("skl", sklearn.__version__)

class TestFeatureCreator(unittest.TestCase):
    def test_kmeans_2_features(self):
        KMeans(n_clusters = 2, n_jobs = 4).fit_predict(numpy.random.randn(360000, 3))

tests/__init__.py пуст.

Затем всякий раз, когда я запускаю python2.7 setup.py test, я получаю следующий вывод:

$ python2.7 setup.py test
running test
Searching for cv2
Best match: cv2 1.0
Processing cv2-1.0-py2.7.egg

Using /home/herbert/Spyder/bla/.eggs/cv2-1.0-py2.7.egg
running egg_info
writing requirements to libbla.egg-info/requires.txt
writing libbla.egg-info/PKG-INFO
writing top-level names to libbla.egg-info/top_level.txt
writing dependency_links to libbla.egg-info/dependency_links.txt
reading manifest file 'libbla.egg-info/SOURCES.txt'
writing manifest file 'libbla.egg-info/SOURCES.txt'
running build_ext
('cv2', '3.0.0-dev')
('np', '1.10.1')
('skl', '0.16.1')
test_kmeans_2_features (tests.some_test.TestFeatureCreator) ... ok

----------------------------------------------------------------------
Ran 1 test in 1.156s

OK
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.7/dist-packages/joblib/pool.py", line 535, in <lambda>
    atexit.register(lambda: delete_folder(pool_folder))
TypeError: 'NoneType' object is not callable
Error in sys.exitfunc:
Traceback (most recent call last):
  File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.7/dist-packages/joblib/pool.py", line 535, in <lambda>
    atexit.register(lambda: delete_folder(pool_folder))
TypeError: 'NoneType' object is not callable
$

Я не уверен, является ли это ошибкой opencv2, sklearn или numpy, поэтому я пошел сюда. Кто-нибудь знает, что здесь происходит?

Некоторые особенности:

  • удаление "cv2" из install_requires удаляет обе ошибки
  • idem для того, чтобы не работать Kmeans
  • idem для Kmeans без указания n_jobs.
  • при печати atexit.register, delete_folder и pool_folder непосредственно перед ошибкой ни один из них не является None.

Пожалуйста, также прокомментируйте, если вы не можете воспроизвести ошибку :)


person Herbert    schedule 25.11.2015    source источник
comment
Я воспроизвел эту ошибку и в системе CentOS.   -  person Herbert    schedule 26.11.2015
comment
О подобной ошибке сообщалось здесь: github.com/joblib/joblib/issues/328   -  person ogrisel    schedule 24.03.2016


Ответы (1)


Исправление этой проблемы было объединено с мастером joblib (будет включено в следующий выпуск 0.10):

https://github.com/joblib/joblib/pull/329

person ogrisel    schedule 29.03.2016