Bazel rules_python无法将xgboost复制到runfiles目录中

时间:2018-05-31 19:27:47

标签: python bazel xgboost

我有一个包含以下文件的玩具python项目:

requirements.txt:

numpy==1.14.3
xgboost==0.71

print_numpy_version.py:

from __future__ import print_function
import numpy
print('numpy version: %s' % numpy.version.version)

print_xgboost_version.py:

from __future__ import print_function
import xgboost
print('xgboost version: %s' % xgboost.__version__)

当我创建virtualenv,安装软件包并运行这两个程序时,一切都按照您的预期完成:

$ mkvirtualenv toyvirtualenv

New python executable in /home/username/.virtualenvs/toyvirtualenv/bin/python2.7
Also creating executable in /home/username/.virtualenvs/toyvirtualenv/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/username/.virtualenvs/toyvirtualenv/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/username/.virtualenvs/toyvirtualenv/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/username/.virtualenvs/toyvirtualenv/bin/preactivate
virtualenvwrapper.user_scripts creating /home/username/.virtualenvs/toyvirtualenv/bin/postactivate
virtualenvwrapper.user_scripts creating /home/username/.virtualenvs/toyvirtualenv/bin/get_env_details

(toyvirtualenv)$ pip install -r requirements.txt

Collecting numpy==1.14.3 (from -r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/b8/97/ecff917542e3a8a33bc8e88c031ed50c90577fd205eab362b29f3e57c09e/numpy-1.14.3-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Collecting xgboost==0.71 (from -r requirements.txt (line 2))
Collecting scipy (from xgboost==0.71->-r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/d1/d6/3eac96ffcf7cbeb37ed72982cf3fdd3138472cb04ab32cdce1f444d765f2/scipy-1.1.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Installing collected packages: numpy, scipy, xgboost
Successfully installed numpy-1.14.3 scipy-1.1.0 xgboost-0.71

(toyvirtualenv)$ python print_numpy_version.py; python print_xgboost_version.py

numpy version: 1.14.3
xgboost version: 0.71

现在,我想要Bazelify我的项目,因此我创建了一个 WORKSPACE BUILD 文件,其中包含以下内容:

WORKSPACE:

http_archive(
    name = "io_bazel_rules_python",
    strip_prefix = "rules_python-master",
    urls = ["https://github.com/bazelbuild/rules_python/archive/master.zip"],
)

load("@io_bazel_rules_python//python:pip.bzl", "pip_import")

pip_import(
    name = "deps",
    requirements = "//:requirements.txt",
)

load("@deps//:requirements.bzl", "pip_install")

pip_install()

BUILD:

load("@deps//:requirements.bzl", "requirement")

py_binary(
    name = "print_numpy_version",
    srcs = ["print_numpy_version.py"],
    deps = [requirement("numpy")],
)

py_binary(
    name = "print_xgboost_version",
    srcs = ["print_xgboost_version.py"],
    deps = [requirement("xgboost")],
)

现在,如果我停用virtualenv和bazel run //:print_numpy_version,它会完全符合您的预期:

(toyvirtualenv)$ deactivate

$ bazel run //:print_numpy_version

INFO: Analysed target //:print_numpy_version (11 packages loaded).
INFO: Found 1 target...
Target //:print_numpy_version up-to-date:
  bazel-bin/print_numpy_version
INFO: Elapsed time: 1.301s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

INFO: Running command line: bazel-bin/print_numpy_version
numpy version: 1.14.3

但是,如果我执行bazel run //:print_xgboost_version,则会失败并显示错误:

$ bazel run //:print_xgboost_version

INFO: Analysed target //:print_xgboost_version (1 packages loaded).
INFO: Found 1 target...
Target //:print_xgboost_version up-to-date:
  bazel-bin/print_xgboost_version
INFO: Elapsed time: 0.231s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

INFO: Running command line: bazel-bin/print_xgboost_version
Traceback (most recent call last):
  File "/private/var/tmp/_bazel_username/aa3d6add0ad8594663c5db9508eed16c/execroot/__main__/bazel-out/darwin-fastbuild/bin/print_xgboost_version.runfiles/__main__/print_xgboost_version.py", line 3, in <module>
    import xgboost
ImportError: No module named xgboost
ERROR: Non-zero return code '1' from command: Process exited with status 1

似乎对于numpy情况,依赖项被复制到runfiles目录中:

$ ls ./bazel-bin/print_numpy_version.runfiles/pypi__numpy_1_14_3

__init__.py     numpy           numpy-1.14.3.data   numpy-1.14.3.dist-info

(注意那里的numpy子目录)

但对于xgboost情况,依赖项被复制到runfiles目录中:

$ ls ./bazel-bin/print_xgboost_version.runfiles/pypi__xgboost_0_71 /

__init__.py     xgboost-0.71.data   xgboost-0.71.dist-info

xgboost子目录在哪里?)

我必须承认,我对这种行为感到困惑。任何指导都将非常感谢!

1 个答案:

答案 0 :(得分:0)

这是rules_python中的一个错误,核心问题是这个:

https://github.com/bazelbuild/rules_python/issues/92