在此处文档中具有 Hy 程序的 shell 脚本中使用 `click`

Using `click` in a shell script that has a Hy program in a here document

如何将以下使用带 shell + python repl(我认为)的点击的工作示例转换为 hy

python3 - "$@" <<'EOF'
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
EOF

当我将以下 hy 示例与 ./test.sh --name shadowrylander --count 3 一起使用时,我得到:

Usage: hy [OPTIONS]
Try 'hy --help' for help.

Error: Got unexpected extra argument (-)

我什么时候应该得到:

Hello shadowrylander!
Hello shadowrylander!
Hello shadowrylander!
hy - "$@" <<'EOF'
(import click)

#@(
    (.command click)
    (.option click "--count" :default 1 :help "Number of greetings")
    (.option click "--name" :prompt "Your name" :help "The person to greet.")
    (defn hello
    [count name]
    """Simple program that greets NAME for a total of COUNT times."""
    (for [x (range count)]
        (.echo click "Hello %s" % name)))
)

(if (= __name__ "__main__") (hello))
EOF

通常我可以毫无问题地使用hy - "$@" <<'EOF' ... EOF

我对 click 的了解还不够,无法调试它,但作为 Hy 开发人员,我可以验证错误消息是由 click 产生的,而不是由 Hy 自己的命令行产生的-hy.cmdline 中的参数处理。需要进行一些挖掘才能确定是否需要更改 click 或 Hy 才能使这项工作正常进行。我的猜测是 click 对 Hy 如何影响 sys.argv 或 Hy 如何部分取代 Python 解释器感到困惑。

您的 Hy 程序不太正确,因为它试图使用 % 作为中缀。 .echo 形式需要 (.echo click (% "Hello %s" name))。通过此更改,Hy 代码保存到 test.hy 和 运行 并使用 hy test.hy --name shadowrylander --count 3(而不是使用 shell 脚本作为中介),它按预期工作。

My guess is that click is confused by how Hy affects sys.argv or by how Hy partly replaces the Python interpreter.

根据,答案如下:

(import [sys [argv]])
(del (cut argv 0 1))

这将在 click 调用之前出现。