簡體   English   中英

如何將 stdin 上的輸入發送到 Makefile 中定義的 python 腳本?

[英]How to send input on stdin to a python script defined inside a Makefile?

鑒於此問題的答案, 在 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)'

結果:(沒有新行)

在此處輸入圖片說明


相關問題:

  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}"

結果:

在此處輸入圖片說明

  1. Makefile 作為shebang 的可執行腳本?

對我來說,規避所有命令行引用問題的最簡單方法是使用 GNUmake 的$(file )函數將代碼寫入$(file ) 您甚至可以在define d 變量中使用#作為 Python 注釋:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM