不能在Bazel genru中使用Python的sh模块

2024-06-26 00:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

当我从bazel genrule运行使用'sh'模块的python脚本时,它失败了:

INFO: Analysed target //src:foo_gen (8 packages loaded).
INFO: Found 1 target...
ERROR: /home/libin11/workspace/test/test/src/BUILD:1:1: Executing genrule //src:foo_gen failed (Exit 1)
Traceback (most recent call last):
  File "src/test.py", line 2, in <module>
    sh.touch("foo.bar")
  File "/usr/local/lib/python2.7/dist-packages/sh.py", line 1427, in __call__
    return RunningCommand(cmd, call_args, stdin, stdout, stderr)
  File "/usr/local/lib/python2.7/dist-packages/sh.py", line 767, in __init__
    self.call_args, pipe, process_assign_lock)
  File "/usr/local/lib/python2.7/dist-packages/sh.py", line 1784, in __init__
    self._stdout_read_fd, self._stdout_write_fd = pty.openpty()
  File "/usr/lib/python2.7/pty.py", line 29, in openpty
    master_fd, slave_name = _open_terminal()
  File "/usr/lib/python2.7/pty.py", line 70, in _open_terminal
    raise os.error, 'out of pty devices'
OSError: out of pty devices
Target //src:foo_gen failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 2.143s, Critical Path: 0.12s
INFO: 0 processes.
FAILED: Build did NOT complete successfully

我想把第三方的项目整合到我自己的项目中。第三方项目是用python脚本构建的,所以我想用bazel genrule构建这个项目。在

以下是文件列表示例:

^{pr2}$

工作区为空,内部版本为:

genrule(
    name = "foo_gen",
    srcs = glob(["**/*"]),
    outs = ["foo.bar"],
    cmd = "python $(location test.py)",
)

在测试.py是:

import sh
sh.touch("foo.bar")

然后运行:

bazel build //src:foo_gen

操作系统:Ubuntu 16.04 bazel:0.14.1版


Tags: inpyinfosrcfoolibpackagesusr
1条回答
网友
1楼 · 发布于 2024-06-26 00:29:46

看起来,如果您将调用改为sh.touch("foo.bar", _tty_in=False, _tty_out=False),它会起作用,但是您仍然需要对genrule进行一些修改,否则它将不会产生输出。在

我更喜欢使用bazel python rules导入pip依赖项,这样我就可以为genrule创建工具了。通过这种方式,bazel处理pip需求安装,您不必修改测试.py文件。在

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

py_binary(
    name = "foo_tool",
    srcs = [
        "test.py",
    ],
    main = "test.py",
    deps = [
        requirement("sh"),
    ],
)

genrule(
    name = "foo_gen",
    outs = ["foo.bar"],
    cmd = """
      python3 $(location //src:foo_tool)
      cp foo.bar $@
    """,
    tools = [":foo_tool"],
)

请注意genrule命令中所需的副本。如果python脚本可以输出到std out,那么就可以将输出重定向到文件,而不是添加copy命令。有关详细信息,请参见this。在

我对这些更改的输出:

^{pr2}$

相关问题 更多 >