【问题标题】:Sending variables to bash from python从 python 将变量发送到 bash
【发布时间】:2016-02-01 02:55:08
【问题描述】:

我已尽我所能进行研究,并且已经到了使用 subprocess 和 subprocess.call 来帮助我将 python 变量发送到 bash 的地步。我设法从 bash 输出中获取了我的 python 变量,但现在我需要这些变量保持同步。我环顾四周无法学习如何有效地使用 subprocess.call。我一直在使用 subprocess.check_output 将 bash 输出完美地获取到 python 变量中。我很难理解 subprocess.call 如何接受参数以及如何正确使用它。我尝试遵循我认为正确的格式。 这是我的代码。 P.S 我是刚加入这个论坛的新手,尽管多年来我一直在使用它来获取大量有用的信息。我不知道如何格式化我的代码输入看起来像我在这里看到的那样漂亮。不管我确定你可以原谅我,因为我尝试了“代码”“块引用”等按钮。

###BEGINING OF CODE###
#! /usr/bin/env python2
import os,time,subprocess

#GRAB DATA
os.system('ifconfig > /tmp/ifconfig.txt;clear;cat /tmp/ifconfig.txt|grep "wlan"|cut -c 1-5 > /tmp/dev.lst;clear;')

#SET allwlan
allwlan=subprocess.check_output("cat /tmp/dev.lst", shell=True)

#SET max_index VARIABLE
max_index=subprocess.check_output("wc -l < /tmp/dev.lst", shell=True)

#SET curwlan WLAN LINE
#os.system(echo 2 > /tmp/curline.lst)

#STRIP DATA FOR curwlan
subprocess.call(['head', '-2', '/tmp/dev.lst', stdout=subprocess.PIPE, shell=True'])
#NEED#HELP#HERE# subprocess.call(['tail', '-1', > /tmp/curwlan.lst;')

#SET curwlan VARIABLE
curwlan=subprocess.check_output("cat /tmp/curwlan.lst", shell=True)

##STRIP EXCESS  CHARACTERS/EMPTY LINES FROM VARIABLES##
curwlan=str(curwlan)
splitted=curwlan.split()
curwlan=splitted[0]
allwlan=allwlan[:-1]
splitted=max_index.split()
max_ index=splitted[0]
max_index=int(max_index)

##DEBUG MODE
print("Welcome, ")
print("     to debug mode. wireless adapter decting algorithm")
print
print("ALLWLAN:")
print(allwlan)
print
print("CURWLAN:")
print(curwlan)
print
print("MAX_INDEX:")
print(max_index)
print
input("PRESS ENTER TO EXIT")
####END OF CODE####*

我的代码中的错误是 #STRIP 数据用于 curwlan

这是我添加 subprocess.call 命令之前的输出。

Welcome, 
    to debug mode. wireless adapter decting algorithm

ALLWLAN:
wlan0
wlan3

CURWLAN:
wlan2

MAX_INDEX:
2

PRESS ENTER TO EXIT  

我很想学习如何让我的 python 和 bash 部分一起交流它们的变量,我知道我在 subprocess.call 的正确轨道上,我已经挣扎了几天。我正在尝试制作自己的算法来检测我的无线网卡并能够使用每一个(可能有多少或无论它们可能被命名为什么)作为我的变量 由于我不断更改无线网卡名称,现在正在苦苦挣扎的旧脚本。在此先感谢我不明白我要求 subprocess.call 做的事情是否不切实际。

【问题讨论】:

  • 我只是在我的 python 脚本中打印东西,在我的 bash 脚本中我执行 `someVar=$(python script.py)$
  • 您的tail 命令在没有任何输入文件的情况下什么也不做。您尝试从哪个文件或流中提取最后一行?
  • 在 shebang 行之前不能有###BEGINNING OF CODE### 注释;它必须绝对是脚本文件中的第一件事。

标签: python linux bash debian wifi


【解决方案1】:

您将希望尽可能避免外部流程。您正在做的大部分事情仅在 Python 中就很容易完成,并且如果在本地实现的话会更加紧凑和高效。

此外,您将过时的 os.system()subprocess 混合在一起,通常首选后者,os.system() 文档中也指出。

subprocess.call() 仅在您不期望命令有任何输出时才真正适合。您尝试使用它的实例 subprocess.check_output() 将是正确的使用调用。但是,您(据我所知,不必要地)运行 shell 命令并输出到临时文件的地方,您可以使用 subprocess.call(),微不足道。

您需要了解 shell 何时何地有用和必要。在没有外壳的情况下,您拥有shell=True 的许多地方会更安全、更快、更简单、更直接。在您只运行一个简单的硬编码命令而没有重定向或通配符的情况下,从subprocess.whatever('command with args', shell=True) 切换到subprocess.whatever(['command', 'with', 'args']) 将立即减少您的时间和内存占用,而不会产生不良影响。如果您需要重定向、管道或通配符,也许您需要shell=True;但在许多情况下,用 Python 做这些事情会简单明了。例如,head 命令可以在没有 shell 的情况下编写:

with open('/tmp/randomfile', 'w') as outputfile:
    subprocess.call(['head', '-n', '2', '/tmp/dev.lst'], stdout=outputfile)

不管怎样,这些事情已经解决了,这就是我将如何做(我认为)你正在尝试的事情:

#!/usr/bin/env python2

import subprocess

allwlan = []
ifconfig = subprocess.check_output(['ifconfig'])
for line in ifconfig.split('\n'):
    if "wlan" in line:
        allwlan.append(line[0:5].strip())

max_index=len(allwlan)
curwlan=allwlan[1]

这是匆忙拼凑起来的,但我相信我至少捕捉到了您当前的椒盐卷饼逻辑代码的大部分功能;尽管我假设使用随机输出文件散布/tmp 文件系统并不是脚本的基本功能。

【讨论】:

    【解决方案2】:

    谢谢大家的建议。我的剧本已经完成了;一年多后,这部分看起来是这样的,

    def detmon():
    try:
        subprocess.call(['clear'])      
        item = []
        items = []
        the_choice = []
    
        iwconfig = subprocess.check_output(['iwconfig'])
        for line in iwconfig.split():
         if "mon" in line:
          items.append(line.strip(':'))
        subprocess.call(['clear'])
        max_index=len(items)-1
        #items=items[counter]
    
        #Print Files List
        for item in items:
            print(" ", items.index(item), ": ", item)
        os.system('echo "\n"')
        print(len(items))
        try:
            if len(items) >= 0: 
                counter = 0
                allmon = []
                ifconfig = subprocess.check_output(['iwconfig'])
                for line in ifconfig.split():
                 if "mon" in line:
                  allmon.append(line.strip(':'))
                subprocess.call(['clear'])
                max_index=len(allmon)
                curmon=allmon[counter]
                while counter <= max_index:
                 curmon=allmon[counter]
                 subprocess.call(['airmon-ng', 'stop', curmon])
                 counter += 1
            else:
                    print("No more 'mon' interfaces are found")
        except:     
                print("No more 'mon' interfaces are found")
    except KeyboardInterrupt:
        pass
    

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 2020-08-09
      • 2017-10-15
      • 2019-02-08
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多