从python

时间:2016-02-01 02:55:08

标签: python linux bash debian wlan

我已尽力研究,我已经到了使用subprocess和subprocess.call帮助我将python变量发送到bash的地步。我设法从bash输出中获取我的python变量,但现在我需要这些变量同步。我环顾四周无法学习如何有效地使用subprocess.call。我一直在使用subprocess.check_output将bash输出完美地获取到python变量中。我有麻烦了解subprocess.call如何接受参数以及如何正确使用它。我试着遵循我认为正确的格式。 这是我的代码。 P.S我是加入本论坛的新手,尽管多年来我一直在使用它获取大量有用的信息。我不知道如何格式化我的代码输入看起来很好看,就像我在这里看到的一样。无论我确定你可以原谅我,因为我尝试了#34; Code" "引用文字"等按钮。

###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 DATA FOR 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做什么是不现实的。

2 个答案:

答案 0 :(得分:0)

您将希望尽可能避免外部进程。你正在做的大部分内容都很容易用Python做,并且如果在本地实现的话会更加紧凑和高效。

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

subprocess.call()仅在您不希望命令的任何输出时才是合适的。您尝试使用它的实例subprocess.check_output()将是正确使用的调用。但是,你(我理解,不必要地)运行带有输出到临时文件的shell命令的地方,你可以使用subprocess.call(),这是非常简单的。

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

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文件系统与随机输出文件一起使用并不是您脚本的基本功能。

答案 1 :(得分:0)

谢谢大家的建议。我的剧本已经出现了;以下是这部分的内容,超过1年后,

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