Как передать переменную оболочки, возвращаемую из Pythonscript, в другую оболочку для запуска другого Pythonscript в правиле Makefile?

Я пытаюсь в течение нескольких часов и исследую, как передать переменную оболочки, возвращаемую из Pythonscript, в другой сценарий оболочки для запуска другого сценария Python.

У меня есть пример ниже:

MyRule:
export VAR=$(shell python.exe mySkript1.py someInputs); \
echo $$VAR; \
$(shell python.exe mySkript2.py someInputs2 $VAR}) \
echo $$VAR;

Как передать переменную VAR во вторую строку оболочки?

Я попробовал следующее, но ни один из них не сделал этого:

"$VAR"
$$VAR
$(VAR)

.

Почему вы используете $(shell) для запуска команд оболочки в рецепте make? Команды в рецепте make уже выполняются через оболочку, и ваш второй рецепт, в частности, скорее всего, выдаст недопустимый рецепт. Но кроме того, $(shell ...) во втором $VAR расширяется $(shell ...), а не оболочкой, поэтому он не видит переменную среды, добавленную ранее в рецепте. Измените это на make, как в ваших командах $$VAR.

John Bollinger 30.08.2024 16:04

Когда я использую $$VAR, я получаю предупреждение: неопределенная переменная 'VAL'

user19471767 30.08.2024 20:43

«Когда я использую $$VAR, я получаю предупреждение: неопределенная переменная 'VAL» - ваш рецепт предполагает, что вы используете make с оболочкой POSIX, такой как Bash, в качестве SHELL, но ни Bash, ни make не жалуются на ссылки к неопределенным переменным. Если оболочка под ней на самом деле представляет собой PowerShell, вам нужно писать свои рецепты в PowerShell (или переключиться на Bash).

John Bollinger 30.08.2024 20:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Переменная Makefile $VAR отсутствует, поэтому она заменяется пустой строкой.

В любом случае, не используйте $(shell ...)в рецептах.

MyRule:
    export VAR=$$(python.exe mySkript1.py someInputs); \
    echo $$VAR; \
    python.exe mySkript2.py someInputs2 "$$VAR"; \
    echo "$$VAR"

Здравствуйте, в основном код работает, когда я не использую «$$VAR» в качестве параметра. Но при использовании параметра «$$VAR» в качестве параметра я получаю сообщение об ошибке «команда не найдена». Как я могу это исправить?

user19471767 30.08.2024 18:33

Я удалил кавычки "". Теперь это работает!.

user19471767 30.08.2024 21:49

Похоже, у вас где-то есть дополнительные ошибки. Возможно, посмотрите Когда заключать переменную оболочки в кавычки?

tripleee 30.08.2024 22:38

Вы можете использовать переменные make и сделать:

VAR=$(shell python.exe mySkript1.py someInputs)

MyRule:
      python.exe mySkript2.py someInputs2 "$(VAR)"

В версии GNU-Make, которую я сейчас использую, VAR не расширяется, если это не необходимо, поэтому запуск других рецептов не обязательно приведет к ненужному выполнению python.exe, но я не уверен, что другие версии make будут делать.

Будет ли это хорошей идеей для вашего варианта использования, будет зависеть от того, будет ли это хорошей идеей для вашего варианта использования.

Этот вариант немного рискован. Если VAR в конечном итоге будет содержать символы ", символы $ или некоторые другие вещи, то они будут обработаны оболочкой, а не восприняты как литералы. Ситуацию можно было бы улучшить, но не решить полностью, если бы заключить расширение $(VAR) в одинарные кавычки вместо двойных. То же самое нельзя сказать о захвате вывода первого сценария в переменной оболочки и предоставлении оболочке возможности его расширения (внутри двойных кавычек).

John Bollinger 30.08.2024 19:44

Другие вопросы по теме