2017-04-02 37 views
1

如何正確包含my_math/clog.hmy_mathtox通過py.test套件?如何正確包含Cython頭文件(setup.py)?


項目文件結構:

my_math/__init__.py 
my_math/clog.h 
my_math/clog.pxd 
my_math/integrate.pyx 
setup.py 
tests/__init__.py 
tests/test_log.py 
tox.ini 

my_math/clog.h

#include <python.h> 
#include <math.h> 

#if PY_VERSION_HEX < 0x3050000 && (defined(_WIN32) || defined(_WIN64)) 
// Calculates log2 of number 
double log2(double n); 
{ 
    // log(n)/log(2) is log2 
    double log_2 = 0.693147180559945309417232121458176568075500134360255254120680; 
    return log(n)/log_2; 
} 
#endif 

my_math/integrate.pyx

def extern from "clog.h": 
    double log2(double) 

def call_log2(n): 
    return log2(n) 

個setup.py

import os 

from setuptools import setup, Extension 
from setuptools.dist import Distribution 
from Cython.Distutils import build_ext 

Distribution(dict(setup_requires='Cython')) 

ext_modules = [ 
    Extension("my_math.integrate", ["my_math/integrate.pyx"], 
       include_dirs=['my_math'], # path to .h file(s) 
       library_dirs=['my_math'], # path to .a or .so file(s) 
       # libraries=['clog'], 
       extra_compile_args = ['-I/usr/local/include', 
            '-L/usr/local/lib'], 
       depends=['my_math/clog.h'] 
      ) 
] 

setup(
    name='my_math', 
    package_dir={'my_math': 'my_math'}, 
    packages=['my_math'], 
    include_package_data=True, 
    package_data={'': ['*.pyx', '*.pxd', '*.h', '*.c']}, 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules=ext_modules 
) 

測試/ test_log.py

from pytest import approx 

from my_math.integrate import call_log2 

def test_call_log2(): 
    assert approx(call_log2(100)) == 6.64386 

tox.ini

[tox] 
envlist = py36 

[testenv] 
deps = cython 
     pytest 
commands = python setup.py build_ext --inplace 
      py.test tests 

my_math/__init__.pytests/__init__.py是空的。


我跑python3 setup.py build_ext --inplace沒有任何毛刺。

我可以調用函數call_log2直接:

python3 -c 'from my_math.integrate import call_log2; print(call_log2(100))' 
6.643856189774724 

但不能與tox

clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -Imy_math -I/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c my_math/integrate.c -o build/temp.macosx-10.11-x86_64-3.6/my_math/integrate.o -I/usr/local/include -L/usr/local/lib 
clang: warning: argument unused during compilation: '-L/usr/local/lib' 
my_math/integrate.c:432:10: fatal error: 'clog.h' file not found 
#include "clog.h" 
     ^
1 error generated. 
error: command 'clang' failed with exit status 1 

如果我取消# libraries = ['clog'],新鮮python3 setup.py build_ext --inplace會產生ld: library not found for -lclog錯誤。

回答