Python 如何使用'|';使用操作系统?

Python 如何使用'|';使用操作系统?,python,os.system,Python,Os.system,我想把我系统的ip地址写入一个文件。 如果在终端中运行以下命令: ifconfig eth0 grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' awk '{print $1,$2,$3,$4,$5} NR==2{exit}' > ip_config.txt 它创建了一个名为ip_config.txt的文件,其中包含以下内容 192.168.2.10 255.255.255.0 现在我想使用os.system()从python脚本运行这个命令。 但是

我想把我系统的ip地址写入一个文件。 如果在终端中运行以下命令:

ifconfig eth0 grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' awk '{print $1,$2,$3,$4,$5} 
NR==2{exit}' > ip_config.txt
它创建了一个名为ip_config.txt的文件,其中包含以下内容

192.168.2.10
255.255.255.0
现在我想使用os.system()从python脚本运行这个命令。 但是如果我跑

os.system("ifconfig eth0 grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' awk '{print 
$1,$2,$3,$4,$5} NR==2{exit}' > ip_config.txt")
它将创建文件,但文件为空。 似乎os.system无法处理管道(“|”)。
我能强迫它使用管道吗?

通常你不能,你能做的是用stdout=pipe创建一个Popen对象,然后你可以使用communicate()

有关更多信息,请阅读子流程模块,特别是创建stdout=PIPE的Popen对象

例如:


first_command = subprocess.Popen( ['ifconfig eth0'], stdout=subprocess.PIPE )
stdout, _ = first_command.communicate()
Now stdout will hold the output from running `ifconfig eth0`.

一般来说,您不能这样做,您可以使用stdout=PIPE创建一个Popen对象,然后使用communicate()

有关更多信息,请阅读子流程模块,特别是创建stdout=PIPE的Popen对象

例如:


first_command = subprocess.Popen( ['ifconfig eth0'], stdout=subprocess.PIPE )
stdout, _ = first_command.communicate()
Now stdout will hold the output from running `ifconfig eth0`.

在Python中运行shell命令时,Subprocess模块是您的朋友,因为它具有灵活性和扩展支持。你可以用@BarT来引用答案

但是如果您仍然坚持使用os模块编写一些东西,那么您可以很好地使用popen对象。下面的示例代码段(根据我的机器的正则表达式和过滤器):

外壳:

$ ifconfig eth0 | grep "inet"
    inet 10.60.4.240  netmask 255.255.248.0  broadcast 10.60.7.255 
>>> import os
>>> f = os.popen('ifconfig eth0 | grep "inet" | awk \'{print $2}\'')
>>> my_ip=f.read()
>>> my_ip
'10.60.4.240\n'
Python:

$ ifconfig eth0 | grep "inet"
    inet 10.60.4.240  netmask 255.255.248.0  broadcast 10.60.7.255 
>>> import os
>>> f = os.popen('ifconfig eth0 | grep "inet" | awk \'{print $2}\'')
>>> my_ip=f.read()
>>> my_ip
'10.60.4.240\n'

在Python中运行shell命令时,Subprocess模块是您的朋友,因为它具有灵活性和扩展支持。你可以用@BarT来引用答案

但是如果您仍然坚持使用os模块编写一些东西,那么您可以很好地使用popen对象。下面的示例代码段(根据我的机器的正则表达式和过滤器):

外壳:

$ ifconfig eth0 | grep "inet"
    inet 10.60.4.240  netmask 255.255.248.0  broadcast 10.60.7.255 
>>> import os
>>> f = os.popen('ifconfig eth0 | grep "inet" | awk \'{print $2}\'')
>>> my_ip=f.read()
>>> my_ip
'10.60.4.240\n'
Python:

$ ifconfig eth0 | grep "inet"
    inet 10.60.4.240  netmask 255.255.248.0  broadcast 10.60.7.255 
>>> import os
>>> f = os.popen('ifconfig eth0 | grep "inet" | awk \'{print $2}\'')
>>> my_ip=f.read()
>>> my_ip
'10.60.4.240\n'

你也可以试着避开管道,就像UnknwTech回答的那样

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()

你也可以试着避开管道,就像UnknwTech回答的那样

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()

看这个。这回答了你的问题吗?看这个。这回答了你的问题吗?