Python 子进程将调用输出存储到文件
Python Subprocess storing call output to file
我已经尝试过我所见过的方法,但不幸的是,文档没有太多关于存储输出的内容。我试过以下方法:
import subprocess
f = open(r'/var/log/temp.txt','w')
subprocess.call('cd /var/log/messagelog', shell=True, stdout=f)
f.close()
with open("/var/log/temp.txt",'r') as f:
for line in f:
print line
我要做的就是让程序识别该目录不存在。我暂时用一个简单的打印语句代替。我不能为此使用 check_output,因为在 30 个不同的系统上更新 Python 对此非常不切实际。打印行应产生:"cd: can't cd to /var/log/messagelog"。希望这是我在这里犯的一个新手错误,所以非常感谢这里的另一双眼睛。
编辑:我在这里要做的就是查看该目录是否存在,如果不存在,则创建该目录。可能还有其他方法可以做到这一点,但我所看到的一切都指向子流程。 cd 不是程序,因此我必须使用 call 而不是 Popen。
使用os
模块检查目录是否存在,如果不存在则创建potential race condition:
import os
if not os.path.isdir('/var/log/messagelog'):
os.mkdir('/var/log/messagelog')
您也可以尝试创建它并检查特定错误:
import os
try:
os.mkdir(path)
except OSError as e:
if e.errno == 17:
print("dir exists")
else:
raise
您可以使用 EEXIST
常量,如果它更易读的话:
import errno
import os
try:
os.mkdir(path)
except OSError as e:
if errno.EEXIST == e.errno:
print("dir exists")
else:
raise
这只会捕获目录存在错误,任何其他 OSError 都会被引发,这可能是也可能不是你想要的。
你应该使用
proc = sp.Popen(..., stdout=filehandle)
err = proc.communicator()
而不是 sp.call
。输出将在 out
.
查看文档。
我已经尝试过我所见过的方法,但不幸的是,文档没有太多关于存储输出的内容。我试过以下方法:
import subprocess
f = open(r'/var/log/temp.txt','w')
subprocess.call('cd /var/log/messagelog', shell=True, stdout=f)
f.close()
with open("/var/log/temp.txt",'r') as f:
for line in f:
print line
我要做的就是让程序识别该目录不存在。我暂时用一个简单的打印语句代替。我不能为此使用 check_output,因为在 30 个不同的系统上更新 Python 对此非常不切实际。打印行应产生:"cd: can't cd to /var/log/messagelog"。希望这是我在这里犯的一个新手错误,所以非常感谢这里的另一双眼睛。
编辑:我在这里要做的就是查看该目录是否存在,如果不存在,则创建该目录。可能还有其他方法可以做到这一点,但我所看到的一切都指向子流程。 cd 不是程序,因此我必须使用 call 而不是 Popen。
使用os
模块检查目录是否存在,如果不存在则创建potential race condition:
import os
if not os.path.isdir('/var/log/messagelog'):
os.mkdir('/var/log/messagelog')
您也可以尝试创建它并检查特定错误:
import os
try:
os.mkdir(path)
except OSError as e:
if e.errno == 17:
print("dir exists")
else:
raise
您可以使用 EEXIST
常量,如果它更易读的话:
import errno
import os
try:
os.mkdir(path)
except OSError as e:
if errno.EEXIST == e.errno:
print("dir exists")
else:
raise
这只会捕获目录存在错误,任何其他 OSError 都会被引发,这可能是也可能不是你想要的。
你应该使用
proc = sp.Popen(..., stdout=filehandle)
err = proc.communicator()
而不是 sp.call
。输出将在 out
.
查看文档。