在Python中读写不同的文件

时间:2015-05-14 23:58:15

标签: python

我正在尝试阅读来自" command.txt"的命令。文件,并希望将此命令的输出重定向到" output.txt",command.txt的内容

ps -a
free

到目前为止,我想出了这个代码,由于某些原因它不好并且无法执行。

import os
import sys
import subprocess
with open('output.txt', 'w') as out_file, open('command.txt', 'r') as in_file:
     for line in in_file:
         output = subprocess.Popen(line, stdout=subprocess.PIPE)
         print output
         out_file.write(output)

我收到以下错误:

Error:
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7/Users/PythonTutorials/subprocess1.py
Traceback (most recent call last):
   File "/Users/shandeepkm/PythonTutorials/subprocess1.py", line 9, in <module>
   output = subprocess.Popen(line, stdout=subprocess.PIPE)
   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__
errread, errwrite)
   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child
raise child_exception
  OSError: [Errno 2] No such file or directory

Process finished with exit code 1

任何人都可以为此任务建议适当的python代码。

2 个答案:

答案 0 :(得分:3)

我看到两个错误。

首先,你有&#34; command.txt&#34;作为文件的第一行。这肯定不会作为子流程执行。

另外,你的行

out_file.write(output)

需要在for循环下标记。

现在更新问题:

Popen构造函数需要为args获取一个数组。而不是

'ps -a'

你需要通过

['ps', '-a']

此外,从Popen返回的内容不是文字。所以你需要:

args = shlex.split(line)
output = subprocess.Popen(args, stdout=subprocess.PIPE).stdout.read()

答案 1 :(得分:1)

解决方案1:逐行执行

您可以使用stdout

Popen参数重定向到文件
import subprocess
import shlex

with open('output.txt', 'wb') as outfile, open('command.txt') as infile:
    for line in infile:
        command = shlex.split(line)
        if not command:
            continue  # Skip blank lines
        try:
            process = subprocess.Popen(command, stdout=outfile)
            process.wait()
        except OSError:
            outfile.write('COMMAND ERROR: {}'.format(line))

在上面的代码中,您通过将stdout指向输出文件的句柄来重定向输出,无需打印。该代码还可以防止错误的命令

解决方案2:调用shell

如果您在Linux或Mac下运行,以下解决方案更简单:通过调用bash执行整个command.txt文件并记录stdout和stderr。这应该在cmd -c的窗口下工作,但我没有Windows机器可以尝试。

import subprocess

with open('output.txt', 'wb') as outfile:
    command = ['bash', 'command.txt']
    process = subprocess.Popen(command, stdout=outfile, stderr=outfile)
    process.wait()