在python中,将子进程附加到列表中似乎只是附加子进程对象的位置?

2024-06-11 19:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在控制台上使用以下命令打印wlan0网卡的本地MAC地址。我想把它集成到一个脚本中,其中列表的第0个子列表将用exer中的本地MAC填充

ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

正在使用的列表localization从一个名为scanned的dict中获取第一个子列表和第二个子列表。

所以我希望在第0个子列表中包含本地MAC,并为第一个子列表和第二子列表中的每个条目提供一个条目。我试过密码:

^{pr2}$

但我只是得到

<subprocess.Popen object at 0x2bf0f50>

对每一个进入名单的人。尽管有正确数量的条目。

我也有一个问题,由于某种原因,程序将代码的输出打印到屏幕上,这是我不希望发生的。

我做错什么了?


Tags: 命令脚本列表mac地址条目grep网卡
3条回答

这是我的尝试:

usecheck_output给出该命令的输出。在

In [3]: import subprocess

In [4]: subprocess.check_output("ip link show wlan0 | grep link | awk '{print $2}'",shell=True).strip()
Out[4]: '48:5d:60:80:e5:5f'

使用ip link show代替ifconfig为您保存一个sudo命令。在

只调用Popen只返回一个新的Popen实例:

In [54]: from subprocess import Popen,PIPE

In [55]: from shlex import split   #use shlex.split() to split the string into correct args

In [57]: ifconf=Popen(split("ifconfig wlan0"),stdout=PIPE)

In [59]: grep=Popen(split("grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"),
                                                   stdin=ifconf.stdout,stdout=PIPE)

In [60]: grep.communicate()[0]
Out[60]: '00:29:5e:3b:cc:8a\n'

使用communicate()从特定Popen实例的stdinstderr读取数据:

^{pr2}$

popen对象在某种意义上是一个文件对象。在

from subprocess import *
handle = Popen(c, stdin=PIPE, stderr=PIPE, stdout=PIPE)
handle.stdin.write('echo "Heeey there"')
print handle.stdout.read()
handle.flush()

为什么没有为您重定向所有输出的原因是stderr=PIPE,否则无论发生什么,它都将被回显到控制台中。将其重定向到管道是个好主意。在

另外,使用shell=True通常是个坏主意,除非您知道为什么需要它。。在这种情况下(我不认为)你不需要它。在

最后,您需要将要执行的命令划分为一个列表,至少是一个2项或更多项的列表。示例:

^{pr2}$

通常是ssh -t user@root "service status-all",注意"service status-all"的NOT splited部分,因为在我的示例中,这是一个整体发送给SSH客户机的参数。在

不尝试,请尝试:

c = ["ifconfig", "wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"]

甚至:

from uuid import getnode as get_mac
mac = get_mac()

相关问题 更多 >