我正在尝试阅读来自" 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代码。
答案 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)
您可以使用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
指向输出文件的句柄来重定向输出,无需打印。该代码还可以防止错误的命令
如果您在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()