如何将os.system()输出存储在python中的变量或列表中[重复]
Posted
技术标签:
【中文标题】如何将os.system()输出存储在python中的变量或列表中[重复]【英文标题】:How to store os.system() output in a variable or a list in python [duplicate] 【发布时间】:2013-10-16 13:12:02 【问题描述】:我正在尝试通过使用以下命令在远程服务器上执行 ssh 来获取命令的输出。
os.system('ssh user@host " ksh .profile; cd dir; find . -type f |wc -l"')
这个命令的输出是 14549 0
为什么输出中有一个零? 有没有办法将输出存储在变量或列表中?我也尝试将输出分配给一个变量和一个列表,但我在变量中只得到 0。我正在使用 python 2.7.3。
【问题讨论】:
如果您使用的是 Python 2.7,请使用subprocess
模块而不是 os.system
。
How to save the data coming from "sudo dpkg -l" in Ubuntu terminal by using python 和 How to save the data coming from "sudo dpkg -l" in Ubuntu terminal by using python 的可能重复项
【参考方案1】:
如果您在交互式 shell 中调用 os.system(),os.system() 会打印命令的标准输出('14549',wc -l 输出),然后解释器会打印命令的结果函数调用本身(0,命令中可能不可靠的退出代码)。一个更简单的命令示例:
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("echo X")
X
0
>>>
【讨论】:
我觉得这不能回答问题【参考方案2】:关于这个有很多很好的 SO 链接。尝试Running shell command from Python and capturing the output 或Assign output of os.system to a variable and prevent it from being displayed on the screen 作为初学者。总之
import subprocess
direct_output = subprocess.check_output('ls', shell=True) #could be anything here.
应谨慎使用 shell=True 标志:
来自文档: 警告
如果与不受信任的输入结合使用,使用 shell=True 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅常用参数下的警告。
查看更多信息:http://docs.python.org/2/library/subprocess.html
【讨论】:
嗨,我的输出有这些字符: b'Fri Nov 27 14:20:49 CET 2020\n' 。 b' 和 \n' 。你知道为什么会这样吗? @paul 如果我使用 os.system 它不会出现,但我不能将它保存在 var @Shalomi11 是的 b 表示返回的数据是字节而不是字符。请参阅此以获得更完整的处理:docs.python.org/3/howto/unicode.html。总之,它需要被解码以从字节中返回一个字符串(例如 b'abc'.decode('utf8') )。换行符就是从正在使用的底层命令返回输出的方式。请参阅***.com/questions/36422572/… 进行讨论【参考方案3】:添加到保罗的答案(使用 subprocess.check_output):
我稍微重写了它,以便更容易处理可能引发错误的命令(例如,在非 git 目录中调用“git status”将引发返回码 128 和 CalledProcessError)
这是我的 Python 2.7 示例:
import subprocess
class MyProcessHandler( object ):
# *********** constructor
def __init__( self ):
# return code saving
self.retcode = 0
# ************ modified copy of subprocess.check_output()
def check_output2( self, *popenargs, **kwargs ):
# open process and get returns, remember return code
pipe = subprocess.PIPE
process = subprocess.Popen( stdout = pipe, stderr = pipe, *popenargs, **kwargs )
output, unused_err = process.communicate( )
retcode = process.poll( )
self.retcode = retcode
# return standard output or error output
if retcode == 0:
return output
else:
return unused_err
# call it like this
my_call = "git status"
mph = MyProcessHandler( )
out = mph.check_output2( my_call )
print "process returned code", mph.retcode
print "output:"
print out
【讨论】:
【参考方案4】:你可以使用os.popen().read()
import os
out = os.popen('date').read()
print out
Tue Oct 3 10:48:10 PDT 2017
【讨论】:
以上是关于如何将os.system()输出存储在python中的变量或列表中[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python:运行 os.system 后如何获取标准输出? [复制]
Python:如何保存 os.system 的输出 [重复]
如何结束作为 os.system() 调用运行的线程(Python)