我已尽力研究,我已经到了使用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做什么是不现实的。
答案 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