将os.system的输出保存到文本文件

时间:2018-01-25 11:17:57

标签: python

我在所有技术术语上都不是很好,所以我会尽力解释我的问题。

我写了一个小脚本来打开android SDK并检查连接的设备(使用windows 10和python 2.7.14)。我得到的代码如下:

import os
import datetime
import time

print 'Current Directory:', os.getcwd()
print 'Opening Android SDK...'
os.chdir('C:\\android-sdk\\platform-tools')
print 'Current Directory:', os.getcwd()
t = time.ctime()
print t
print 'Checking for connected devices:'
os.system('adb devices -l')

一切正常,但我想将最后3行保存到文本文件中。我已尝试f = open('logfile.txt', 'w')然后使用s = str(t, 'Checking for connected devices:', os.system('adb devices -l'))将其全部转换为字符串并将其写入文件并关闭它,但它无效。它甚至没有创建文件,更不用说写任何东西了。

我可能错过了一些关键但我是新手,所以请你好!

非常感谢任何帮助。

非常感谢

编辑:包含写入内容的整个代码:

import os
import datetime
import time

print 'Current Directory:', os.getcwd()
print 'Opening Android SDK...'
os.chdir('C:\\android-sdk\\platform-tools')
print 'Current Directory:', os.getcwd()
t = time.ctime()
f = open('logfile.txt', 'w')
s = str(t, 'Checking for connected devices:', os.system('adb devices -l'))
f.write(s)
f.close()

4 个答案:

答案 0 :(得分:2)

os.system在子shell中执行命令并返回命令的退出代码。它没有提供任何捕获命令输出的意思(“输出”=>命令打印到它的stdout / stderr流)。

要捕获命令的输出,您必须使用subprocess模块的一些功能,最明显的是subprocess.check_output

# ...
import subprocess
# ...
# NB : you may want to catch subprocess.CalledProcessError here
out = subprocess.check_output(['adb',  'devices', '-l'])
msg = "{t}\nChecking for connected devices:\n{out}".format(t=t, out=out)
with open('logfile.txt', 'w') as f:
    f.write(msg)

答案 1 :(得分:0)

尝试以下方法:

import os 
import subprocess 
import time 

print ('Current Directory: {}'.format(os.getcwd()) ) 
print ('Opening Android SDK...') 
os.chdir('C:\\android-sdk\\platform-tools') 
print ('Current Directory: {}'.format(os.getcwd()) )
t = str(time.ctime()) 
try:
    process_output = subprocess.check_output(["adb", "devices", "-l"])
except: #Add here the type of exception you want to raise and logic
    print("Please check your ADB installation and syntax.")
s = ('{} Checking for connected devices: {}'.format(t,process_output) ) 
with open('logfile.txt', 'w') as f:
    f.write(s) 

答案 2 :(得分:0)

感谢大家的帮助。答案是:

import os
import time
import subprocess

print 'Current Directory:', os.getcwd()
print 'Opening Android SDK...'
os.chdir('C:\\android-sdk\\platform-tools')
print 'Current Directory:', os.getcwd()
print 'Checking for connected devices:'
t = time.ctime()
# save log of time and connected devices
with open('logfile.txt', 'w') as f:
    s = ('{}\n{}'.format(t, subprocess.check_output(["adb", "devices", "-l"])))
    f.write(s)
print(s)

答案 3 :(得分:0)

使用Python 3.5+,你可以(也可能应该)使用subprocess.run(),它可以方便地用更通用的API替换遗留的subprocess.check_output()

import subprocess

with open('logfile.txt', 'w') as f:
    subprocess.run(['adb', 'devices', '-l'], stdout=f,
        universal_newlines=True)  # this obscurely makes everything Unicode

您也可以通过旧的stdout API直接将子流程的check_output()连接到打开的文件句柄。