有没有办法将变量从python脚本传递到bash脚本?

时间:2020-08-05 04:46:58

标签: python bash

我有多个需要顺序执行的python代码。我已经通过使用abash脚本做到了这一点。

#! /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!"

现在,我的error.py的python代码是

#!/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的现有解决方案,但事实b告诉我,我一直无法理解其中的任何一个。请帮忙。

4 个答案:

答案 0 :(得分:0)

任何来自stdout的输出都可以捕获到bash变量中。常规print将打印到标准输出

hello.py

print('hello')

重击

RESULT=`python3 hello.py`
echo $RESULT  # hello

答案 1 :(得分:0)

我认为您应该将bash脚本制作为带有命令行参数的脚本。然后,在您的python脚本中,执行一个subprocess.Popen([['your_bash_script',your_variable])。

答案 2 :(得分:0)

您可以使用if $1第一个参数的值)并修改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。如果您不打算将上下文管理器withopen函数一起使用,请确保在close对象上使用file方法。

答案 3 :(得分:0)

在您的情况下,您想将一个小整数传递给调用程序。基本上,您有三种可能,都有缺点或优点。

  1. 使用退出代码

假设整数始终为非负数且小于256,您可以通过Python exit将其传递回去,并使用变量$?在调用方将其取回,该变量保存了退出代码为最新执行的程序。

python3 your_program.py
count=$?

虽然此方法很简单,但由于两个原因,我不建议这样做:

  • 退出代码用于传达错误,而不是正常数据。
  • 如果您有一天想使用set -e(错误终止)运行脚本,则会遇到麻烦。
  1. 使用标准输出

写出要返回到stdout的整数,然后通过命令替换将其提取,即

count=$(python3 your_program.py)

缺点:如果您有一天想向程序中添加其他输出(例如,用于诊断),则必须将其写入stderr,否则会污染结果计数。

  1. 使用文件

让您的Python程序接受文件名,并将其计数写入该文件:

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

缺点:您必须关心正在创建的count_files,例如,如果不再需要删除它们。