如何将子进程的输出重定向到文件

0 投票
2 回答
1920 浏览
提问于 2025-04-18 07:47

我有一个这样的Python脚本:

import shlex
import subprocess
from datetime import datetime,timedelta
import os
import sys
import xml.etree.ElementTree as ET


time = (datetime.now()- timedelta(hours=6)).strftime('%Y-%m-%dT%H:%M:%S') 
#print time

path = sys.argv[1]

os.chdir(path + '/src/MarketplaceWebServiceOrders/Samples')


cmd = "php -f ListOrders.php %s > response.xml" %(time)
print cmd
args = shlex.split(cmd)
p = subprocess.Popen(args)
p.wait()
respFile = open("response.xml")
respFile.close()

tree = ET.parse(path + '/src/MarketplaceWebServiceOrders/Samples/response.xml')
root = tree.getroot()

我想把这个脚本运行时产生的输出结果保存到一个叫做response.xml的文件里。接下来,我想解析这个response.xml文件的内容。所以在解析之前,这个文件必须先关闭。但是,执行完后,response.xml文件却是空的,我在这一行出错了:tree = ET.parse(...)。我也试过:

respFile = open("response.xml","w")

cmd = "php -f ListOrders.php %s > %s" %(time,respFile)
print cmd
args = shlex.split(cmd)
p = subprocess.Popen(args)
p.wait()
respFile.close()

但这也不行。请问有人能帮忙吗?

2 个回答

1

这里有一个示例,演示如何打开一个文件进行写入或读取:

import subprocess

with open('out.txt', 'w+') as f:
    cmd = ['/bin/ls', '/']
    p = subprocess.Popen(cmd, stdout=f)
    p.communicate()

    # Read from the file
    f.seek(0)
    for line in f:
        print line.strip()
2

这里的 > 是一个命令行的特性,但 Popen() 默认情况下并不使用命令行。你可以通过明确地使用命令行来解决这个问题:

p = subprocess.Popen(args, shell=True)

不过我建议不要使用命令行(这样更安全),可以用纯 Python 的方式把内容写入文件:

p = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)
(stdout, stderr) = p.communicate()
with file('response.xml', 'w') as fp:
    fp.write(stdout)

撰写回答