Sie alle Newline str.rstrip
können oder verwenden, was Martijn schon sagt, können Sie auch die Ausgabe mit Python analysieren mit die Notwendigkeit, awk oder grep, die keine Zeilenumbrüche nicht hinzugefügt werden:
Sie aufspalten:
out = subprocess.check_output(["ifconfig", "en0"])
for line in out.splitlines():
if line.lstrip().startswith("inet "):
print(line.split()[1].split(":", 2)[1])
print(ip.search(line))
break
Oder Ihre eigenen regex verwenden:
import re
out = subprocess.check_output(["ifconfig", "en0"])
print(re.search('([0-9]{1,3}[\.]){3}[0-9]{1,3}', out).group())
Der Punkt, den Sie awk oder grep brauchen nicht zu sein.
Wenn Sie IPv4- oder IPv6 passen wollen und fangen auch wenn es einen Fehler, dh keine solche Schnittstelle zurückgegeben wird, können Sie eine CalledProcessError
fangen, die für jede Nicht-Null-Exit-Status erhoben wird, ist es leicht, die Verwendung der Regex für IPv4- aber Für ipv6 ist es einfacher, inet6
zu verwenden, um die IPv6-Adresse zu greifen.
from subprocess import check_output, CalledProcessError
import re
def get_ip(iface, ipv="ipv4"):
try:
out = check_output(["ifconfig", iface])
except CalledProcessError as e:
print(e.message)
return False
try:
if ipv == "ipv4":
return re.search('([0-9]{1,3}[\.]){3}[0-9]{1,3}', out).group()
return re.search("(?<=inet6 addr:)(.*?)(?=/)", out).group().lstrip()
except AttributeError as e:
print("No {} address for interface {}".format(ipv, iface))
return False
Demo:
In [2]: get_ip("wlan0")
Out[2]: '192.168.43.168'
In [3]: get_ip("wlan0","ipv6")
Out[3]: 'fe80::120b:a9ff:fe03:bb10'
In [4]: get_ip("wlan1","ipv6")
wlan1: error fetching interface information: Device not found
Out[4]: False
'echo' fügt hinzu, dass Newline .. –
nein, nicht nur. Wenn ich 'subprocess.check_output (" ifconfig en0 | awk '{drucken $ 2}' | grep -E -o '([0-9] {1,3} [\.]) {3} [0-9] ausführen {1,3} '", shell = True)' was meine IP-Adresse auf bash Mac OS X abruft, die Return-Zeile ist auch vorhanden – Jupiter
echo -n habe kein echo newline. Oder fügen Sie .strip() am Ende der Unterprozesslinie hinzu – Benjamin