在 Makefile 中使用嵌入式 python 脚本

eli*_*ias 5 make python

我正在尝试在 Make 目标中运行 Python 代码段,但我无法弄清楚这些东西在 Make 中是如何工作的。

到目前为止,这是我的尝试:

define BROWSER_PYSCRIPT
import os, webbrowser, sys
try:
    from urllib import pathname2url
except:
    from urllib.request import pathname2url

webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
BROWSER := $(shell python -c '$(BROWSER_PYSCRIPT)')
Run Code Online (Sandbox Code Playgroud)

我想在目标中使用 $(BROWSER) ,例如:

docs:
    #.. compile docs
    $(BROWSER) docs/index.html
Run Code Online (Sandbox Code Playgroud)

这真的是个坏主意吗?

yae*_*shi 4

相关:https ://stackoverflow.com/q/649246/4937930

您无法像在单个配方中那样调用多行变量,而是会扩展到多个配方并导致语法错误。

一个可能的解决方法是:

export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"

docs:
        #.. compile docs
        $(BROWSER) docs/index.html
Run Code Online (Sandbox Code Playgroud)

  • `$$` 是一个转义的 `$`,所以它在 `$(BROWSER)` 中变成了 `$BROWSER_PYSCRIPT`。Make 保持原样,只需将配方字符串 `python -c "$BROWSER_PYSCRIPT" docs/index.html` 按原样传递给 `$(SHELL)` (通常为 `/bin/sh`),并导出 `BROWSER_SCRIPT`在环境变量中。 (2认同)