如何将 stdin 上的输入发送到 Makefile 中定义的 python 脚本?

2023-11-29

鉴于这个问题的答案,在 Makefile 中嵌入 Python 以设置 make 变量这有效!

define NEWLINE


endef

define PYTHON_SCRIPT_CODE
import sys
print("hi")
endef

SDK_PATH := $(shell echo \
    '$(subst $(NEWLINE),@NEWLINE@,${PYTHON_SCRIPT_CODE})' | \
    sed 's/@NEWLINE@/\n/g' | python -)

default:
    @echo 'SDK Path Detected: $(SDK_PATH)'

如何将数据通过管道传输到 python std 中?例如:

define PYTHON_SCRIPT_CODE
import sys
print("hi")
print(sys.stdin.read())
endef

# pseudocode
SDK_PATH := $(shell bash --version | PYTHON_SCRIPT_CODE)
default:
    @echo 'SDK Path Detected: $(SDK_PATH)'

会输出:

SDK Path Detected: hi
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

现在,我正在这样做:

define NEWLINE


endef

BASH_VERSION := $(shell bash --version)
define PYTHON_SCRIPT_CODE
import sys
print("Hi")
print("${BASH_VERSION}")
endef

SDK_PATH := $(shell echo \
    '$(subst $(NEWLINE),@NEWLINE@,${PYTHON_SCRIPT_CODE})' | \
    sed 's/@NEWLINE@/\n/g' | python -)

default:
    @echo 'SDK Path Detected: $(SDK_PATH)'

结果:(没有新行)

enter image description here


相关问题:

  1. 是否可以在 Makefile 中创建多行字符串变量
  2. https://unix.stackexchange.com/questions/222911/using-embedded-python-script-in-makefile

新示例,无需将内容传输到 Python 脚本中:

#!/usr/bin/make -f
ECHOCMD:=/bin/echo -e
SHELL := /bin/bash

define NEWLINE


endef

VERSION := $(shell bash --version)

# With this, you cannot use single quotes inside your python code
define PYTHON_VERSION_CODE
import re, sys;
program_version = """${VERSION}"""
match = re.search("Copyright[^\d]+(\d+)", program_version);

if match:
    if int( match.group(1) ) >= 2018:
        sys.stdout.write("1")
    else:
        sys.stdout.write( match.group(1) )
else:
    sys.stdout.write("0")
endef

# Due to this, you cannot use single quotes inside your python code
PYTHON_SCRIPT_RESULTS := $(shell echo \
    '$(subst $(NEWLINE),@NEWLINE@,${PYTHON_VERSION_CODE})' | \
    sed 's/@NEWLINE@/\n/g' | python -)

all:
    printf 'Results: %s\n' "${PYTHON_SCRIPT_RESULTS}"

Results:

enter image description here

  1. Makefile 作为带有 shebang 的可执行脚本?

对我来说,规避所有命令行引用问题的最简单方法是将代码写入带有 GNUmake 的文件$(file )功能。你甚至可以使用#作为Python注释里面defined 变量:

VERSION := $(shell bash --version)

# With this, you can use any form of quotes inside your python code
define PYTHON_VERSION_CODE :=
# -*- coding: iso-8859-15 -*-
import re, sys;
program_version = "${VERSION}"
match = re.search("Copyright[^\d]+(\d+)", program_version);

if match:
    if int( match.group(1) ) >= 2018:
        sys.stdout.write("1")
    else:
        sys.stdout.write( "match:" + match.group(1) )
else:
    sys.stdout.write("0")
endef


$(file > test.py,$(PYTHON_VERSION_CODE))

PYTHON_SCRIPT_RESULTS := $(shell python test.py)

.PHONY: all
all:
    @echo $(PYTHON_SCRIPT_RESULTS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 stdin 上的输入发送到 Makefile 中定义的 python 脚本? 的相关文章

随机推荐

  • 为什么在隐含时使用媒体查询类型“all”?

    我最近注意到我一直在使用all在每一个 media查询规则 我不明白为什么我这样做 我在网上搜索过 我发现大多数 media网络上的规则示例使用如下格式 media all and some other condition 为什么有媒体类型
  • 在 Firebase 中随机配对用户[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在使用 Flutter 和 Firebase 开发一个应用程序 我必须解决一个听起来像这样的问题 每个用户 在任何时候 都可以将自己置于等候名单 Firebase 必须通过以下方式
  • 使用正则表达式在 Visual Studio Code 中设置代码片段

    Comment prefix body 我已经设置了about代码片段 目的是添加注释 添加文件的基目录和文件名像这样但丢弃路径的其余部分 我相信这最初是基于 TextMate 片段 我已经尝试了一切 但我无法让它工作 这可能是愚蠢的事情
  • 在两个固定 div 元素之间创建滚动 div

    我对在网站中如何定位 div 不太熟悉 所以我希望有人可以在这里提供帮助 我想要得到的是一个三明治类型的设置 在两个 div 中间有一个滚动内容 这样我就有一个页眉 div 和一个页脚 div 它们都必须在页面上保持静态 然后 在它们之间
  • 一个组件可以有多个模板吗?

    有没有办法让 Angular 2 组件根据我想要放置的位置使用许多模板文件 例如 我有一个login组件 我想用两种不同的设计将其放置在我的网站上两次 有没有一种方法可以将模板传递给组件 不确定 NG2 是否有内置方法来支持这一点 我只是使
  • 在 C# 中检测(通过反射)Enum 类型是否为“Flags”类型的策略

    我使用反射来读取程序集中的类型 以生成代码 我可以看到一些枚举应该标有 Flags 属性 但编写这些枚举的人忘记添加此属性 有没有可靠的方法来检测枚举何时可以被视为 标志 枚举 我目前的策略是按降序读取枚举 并检查 element last
  • 如何生成 R 计数矩阵

    在 R 中 我可以使用我感兴趣的特定列名称作为数组返回计数结果 如下所示 require plyr bevs lt data frame cbind name c Bill Llib drink c coffee tea cocoa wat
  • 从 Java 游戏中删除对象(Eclipse)

    让我们开始吧 我有一个 处理程序 类 它充满了 getter 和 setter 并且其中包含添加和删除对象的代码 它看起来像这样 public void addObject GameObject object this object add
  • 尝试创建下拉菜单 pygame,但卡住了

    到目前为止 这是我的代码 import pygame as pg pg init clock pg time Clock Generating screen w scr 640 h scr 480 size scr w scr h scr
  • 在 Firefox 中禁用跨域 Web 安全

    在 Firefox 中 我该如何做相当于 disable web security在 Chrome 中 这个问题已经被发布了很多次 但从来没有一个真正的答案 大多数是附加组件的链接 其中一些在最新的 Firefox 中不起作用或根本不起作用
  • 如何在 Julia 中使用 JuMP 提取优化问题矩阵 A,b,c

    我使用符号变量和约束在 Julia JuMP 中创建了一个优化模型 例如以下 using JuMP using CPLEX model Mod Model CPLEX Optimizer sets I 1 2 Variables x var
  • Perl 中的读写锁

    我正在寻找一种在 Perl 中实现读 写锁的好方法 这是同步 Windows 和 Unix 上不同 Perl 线程和 或进程的文件访问所必需的 尝试过 Fcntl flock 如果它按预期工作 这对我来说将是完美的 不幸的是 看起来在压力下
  • 是否可以使用 appengine 模块和云端点?

    使用 appengine 模块意味着创建动态 Web 应用程序 而不是通常的 appengine Web 应用程序项目 云端点与常见的 appengine Web 应用程序项目配合良好 但这些项目不支持 appengine 模块 问题是 如
  • 从 XML 生成 SQL 架构

    我们正在使用 Oracle 11 数据库和 java 开发环境 使用 Eclipse 并且希望将多个 xml 模式迁移到 SQL 模式 看过 ax xsd 但确实需要一些我们可以从 ant 运行的东西 未安装 SQL Server 的 Ec
  • Web Api 2 - 自定义数据类型JSON序列化

    我实际上是 Web Api 的新手 所以我的问题可能听起来有点奇怪 我有简单的 API 来返回有关价格变化的历史信息 我的控制器的操作如下所示 HttpGet Route api history id size public async T
  • 检索 SharePoint 列表数据并将其绑定到下拉列表

    我对 SharePoint 相当陌生 因此提前为听起来像 新手 而道歉 我创建了一个简单的 Web 部件 它使用 Web 用户控件 ascxfile 提供 Web 部件的所有控件 在 ascx 文件上 有一个 DropDownList 目前
  • SDN 4 - InProcessServer 在快照构建中损坏

    从大约一周前开始 运行测试进程内服务器 on 4 0 0 构建快照导致以下异常 Caused by java lang NoClassDefFoundError org neo4j ogm testutil TestServer at or
  • INSERT INTO 语句中的语法错误

    当我连接 Access 数据库时遇到问题 然后我在 INSERT INTO 语句中收到错误语法错误 我的代码是 string str Provider Microsoft ACE OLEDB 12 0 Data Source C Users
  • pandas 和 Stata 13 个文件

    我安装了 pandas 0 13 1 但是pandas read stata 无法阅读 dta以 Stata 13 格式创建的文件 出现错误 TypeError cannot concatenate str and NoneType obj
  • 如何将 stdin 上的输入发送到 Makefile 中定义的 python 脚本?

    鉴于这个问题的答案 在 Makefile 中嵌入 Python 以设置 make 变量这有效 define NEWLINE endef define PYTHON SCRIPT CODE import sys print hi endef