Merge pull request #502 from irachex/fix_setup

Fix python setup: avoid import numpy in setup.py
This commit is contained in:
Tianqi Chen 2015-09-17 09:35:46 -07:00
commit a92d21ce24
5 changed files with 63 additions and 43 deletions

View File

@ -17,9 +17,17 @@ if 'pip' in __file__:
output = build_sh.communicate() output = build_sh.communicate()
print(output) print(output)
import xgboost
LIB_PATH = xgboost.core.find_lib_path() CURRENT_DIR = os.path.dirname(__file__)
# We can not import `xgboost.libpath` in setup.py directly since xgboost/__init__.py
# import `xgboost.core` and finally will import `numpy` and `scipy` which are setup
# `install_requires`. That's why using `execfile` here.
libpath_py = os.path.join(CURRENT_DIR, 'xgboost/libpath.py')
libpath = {'__file__': libpath_py}
execfile(libpath_py, libpath, libpath)
LIB_PATH = libpath['find_lib_path']()
#print LIB_PATH #print LIB_PATH
#to deploy to pip, please use #to deploy to pip, please use
@ -27,9 +35,9 @@ LIB_PATH = xgboost.core.find_lib_path()
#python setup.py register sdist upload #python setup.py register sdist upload
#and be sure to test it firstly using "python setup.py register sdist upload -r pypitest" #and be sure to test it firstly using "python setup.py register sdist upload -r pypitest"
setup(name='xgboost', setup(name='xgboost',
version=xgboost.__version__, version=open(os.path.join(CURRENT_DIR, 'xgboost/VERSION')).read().strip(),
#version='0.4a13', #version='0.4a13',
description=xgboost.__doc__, description=open(os.path.join(CURRENT_DIR, 'README.md')).read(),
install_requires=[ install_requires=[
'numpy', 'numpy',
'scipy', 'scipy',

View File

@ -0,0 +1 @@
0.4

View File

@ -5,12 +5,16 @@ Contributors: https://github.com/dmlc/xgboost/blob/master/CONTRIBUTORS.md
""" """
from __future__ import absolute_import from __future__ import absolute_import
import os
from .core import DMatrix, Booster from .core import DMatrix, Booster
from .training import train, cv from .training import train, cv
from .sklearn import XGBModel, XGBClassifier, XGBRegressor from .sklearn import XGBModel, XGBClassifier, XGBRegressor
from .plotting import plot_importance, plot_tree, to_graphviz from .plotting import plot_importance, plot_tree, to_graphviz
__version__ = '0.4' VERSION_FILE = os.path.join(os.path.dirname(__file__), 'VERSION')
__version__ = open(VERSION_FILE).read().strip()
__all__ = ['DMatrix', 'Booster', __all__ = ['DMatrix', 'Booster',
'train', 'cv', 'train', 'cv',

View File

@ -6,16 +6,13 @@ from __future__ import absolute_import
import os import os
import sys import sys
import ctypes import ctypes
import platform
import collections import collections
import numpy as np import numpy as np
import scipy.sparse import scipy.sparse
from .libpath import find_lib_path
class XGBoostLibraryNotFound(Exception):
"""Error throwed by when xgboost is not found"""
pass
class XGBoostError(Exception): class XGBoostError(Exception):
"""Error throwed by xgboost trainer.""" """Error throwed by xgboost trainer."""
@ -81,40 +78,6 @@ def from_cstr_to_pystr(data, length):
return res return res
def find_lib_path():
"""Load find the path to xgboost dynamic library files.
Returns
-------
lib_path: list(string)
List of all found library path to xgboost
"""
curr_path = os.path.dirname(os.path.abspath(os.path.expanduser(__file__)))
#make pythonpack hack: copy this directory one level upper for setup.py
dll_path = [curr_path, os.path.join(curr_path, '../../wrapper/')
, os.path.join(curr_path, './wrapper/')]
if os.name == 'nt':
if platform.architecture()[0] == '64bit':
dll_path.append(os.path.join(curr_path, '../../windows/x64/Release/'))
#hack for pip installation when copy all parent source directory here
dll_path.append(os.path.join(curr_path, './windows/x64/Release/'))
else:
dll_path.append(os.path.join(curr_path, '../../windows/Release/'))
#hack for pip installation when copy all parent source directory here
dll_path.append(os.path.join(curr_path, './windows/Release/'))
if os.name == 'nt':
dll_path = [os.path.join(p, 'xgboost_wrapper.dll') for p in dll_path]
else:
dll_path = [os.path.join(p, 'libxgboostwrapper.so') for p in dll_path]
lib_path = [p for p in dll_path if os.path.exists(p) and os.path.isfile(p)]
if len(lib_path) == 0 and not os.environ.get('XGBOOST_BUILD_DOC', False):
raise XGBoostLibraryNotFound(
'Cannot find XGBoost Libarary in the candicate path, ' +
'did you run build.sh in root path?\n'
'List of candidates:\n' + ('\n'.join(dll_path)))
return lib_path
def _load_lib(): def _load_lib():
"""Load xgboost Library.""" """Load xgboost Library."""
lib_path = find_lib_path() lib_path = find_lib_path()

View File

@ -0,0 +1,44 @@
# coding: utf-8
"""Find the path to xgboost dynamic library files."""
import os
import platform
class XGBoostLibraryNotFound(Exception):
"""Error throwed by when xgboost is not found"""
pass
def find_lib_path():
"""Load find the path to xgboost dynamic library files.
Returns
-------
lib_path: list(string)
List of all found library path to xgboost
"""
curr_path = os.path.dirname(os.path.abspath(os.path.expanduser(__file__)))
# make pythonpack hack: copy this directory one level upper for setup.py
dll_path = [curr_path, os.path.join(curr_path, '../../wrapper/'),
os.path.join(curr_path, './wrapper/')]
if os.name == 'nt':
if platform.architecture()[0] == '64bit':
dll_path.append(os.path.join(curr_path, '../../windows/x64/Release/'))
# hack for pip installation when copy all parent source directory here
dll_path.append(os.path.join(curr_path, './windows/x64/Release/'))
else:
dll_path.append(os.path.join(curr_path, '../../windows/Release/'))
# hack for pip installation when copy all parent source directory here
dll_path.append(os.path.join(curr_path, './windows/Release/'))
if os.name == 'nt':
dll_path = [os.path.join(p, 'xgboost_wrapper.dll') for p in dll_path]
else:
dll_path = [os.path.join(p, 'libxgboostwrapper.so') for p in dll_path]
lib_path = [p for p in dll_path if os.path.exists(p) and os.path.isfile(p)]
if len(lib_path) == 0 and not os.environ.get('XGBOOST_BUILD_DOC', False):
raise XGBoostLibraryNotFound(
'Cannot find XGBoost Libarary in the candicate path, ' +
'did you run build.sh in root path?\n'
'List of candidates:\n' + ('\n'.join(dll_path)))
return lib_path