Есть ли способ передать переменную из сценария python в сценарий bash? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть несколько кодов python, которые нужно выполнить последовательно. Я сделал это с помощью сценария bash.

#! /bin/sh
clear
echo "Test 1: Database Comparison"
python3 databasecomparison.py
python3 error.py

echo "Test 2: Conflicting ARFCNs"
python3 conflictingARFCNs.py

echo "Test 3: Conflicting Cell IDs"
python3 conflictingCID.py

echo "Test 4: Lonesome Location ID"
python3 conflictingLAC.py

echo "Test 5: Empty Neighbour List"
python3 neighbour.py

echo "Test 6: Missing IMSI"
python3 IMSI.py

echo "The tests are complete!"
notify-send "COMPLETED!"

Теперь мой python код error.py равен

#!/usr/bin/env python3
import subprocess as s


file = open("doubt.txt","r") 
Counter = 0
  
# Reading from file 
Content = file.read() 
CoList = Content.split("\n") 
  
for i in CoList: 
    if i: 
        Counter += 1
          
#print("This is the number of lines in the file") 
#print(Counter) 

if Counter > 1:
    print("There is some erroneous value. Please restart the scanner")
    s.call(['notify-send','Alert!','There is some erroneous value. Please restart the scanner'])

Я хочу передать значение переменной Counter из кода python в сценарий bash, чтобы я мог выполнить:

if Counter > 1
then break
fi

Однако я не могу передать переменную Counter. Я просмотрел существующее решение по stackoverflow, но, по правде говоря, я не смог понять ни одно из них. Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 05 августа 2020

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

  1. Используйте код выхода

При условии, что целое число всегда неотрицательно и меньше 256, вы можете передать он возвращается через Python exit и забирает его на стороне вызывающего абонента, используя переменную $?, которая содержит код выхода последней выполненной программы.

python3 your_program.py
count=$?

Хотя этот метод прост , Я не рекомендую его по двум причинам:

  • Коды выхода предназначены для сообщения об ошибках, а не обычных данных.
  • Если вы однажды захотите запустить свой скрипт с set -e (terminate-on-error), у вас будут проблемы.
Используйте стандартный вывод

Напишите целое число, которое вы хотите вернуть в стандартный вывод, и заберите его с помощью подстановки команды, например,

count=$(python3 your_program.py)

Недостаток: если вы однажды захотите добавьте дополнительный вывод в вашу программу (скажем, для диагностики), вам придется записать его в stderr, иначе он испортит ваш результирующий счетчик.

Используйте файл

Пусть ваша программа Python принимает имя файла и позволяет ей записывать счетчик в этот файл:

python3 your_program.py count_file
count=$(<countfile)

Недостаток: вы должны заботиться о создаваемых count_files, например, удалять их, если они больше не нужны.

0 голосов
/ 05 августа 2020

Я думаю, вам следует сделать свой bash сценарий таким, который принимает аргументы командной строки. Затем в вашем python скрипте выполните subprocess.Popen (['your_bash_script', your_variable]).

0 голосов
/ 05 августа 2020

Вы можете использовать if $1 (значение аргумента 1st ) и изменить последнюю строку в вашем error.py, вы сможете получить желаемый результат.

import subprocess as s


file = open("doubt.txt","r") 
Counter = 0
  
# Reading from file 
Content = file.read() 
file.close()
CoList = Content.split("\n") 
  
for i in CoList: 
    if i: 
        Counter += 1
          
#print("This is the number of lines in the file") 
#print(Counter) 

if Counter > 1:
    print("There is some erroneous value. Please restart the scanner")
    s.call(['notify-send', str(Counter), 'Alert!','There is some erroneous value. Please restart the scanner'])
if $1 > 1
then break
fi

Вместо этого вы можете сделать все это примерно в 3 строках, будет намного проще:

import subprocess as s

with open ("doubt.txt","r") as f:
    if len(f.readlines()) > 1:
        s.call(['notify-send', Counter, 'Alert!','There is some erroneous value. Please restart the scanner'])

PS. Если вы не собираетесь использовать диспетчер контекста with с функцией open, убедитесь, что вы используете метод close для своего объекта file.

0 голосов
/ 05 августа 2020

Любой вывод из stdout может быть записан в переменную bash. Обычный print будет печатать в стандартный вывод

hello.py

print('hello')

bash

RESULT=`python3 hello.py`
echo $RESULT  # hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...