【发布时间】:2014-02-20 13:23:11
【问题描述】:
我意识到,我的问题是一个非常简单的问题,但我找不到任何将 stdin 标准输出实现为 Python 脚本的明确示例。
我有一个脚本,可以很好地使用命令行参数:
newlist = []
def f1()
....
def f2(input_file):
vol_id = sys.argv[3]
for line in input_file:
if ... :
line = line.replace('abc','def')
line = line.replace('id', 'id'+vol_id)
....
newlist.append(line)
return newlist
def main():
if len(sys.argv) < 4:
print 'usage: ./myscript.py [file_in... file_out... volume_id]'
sys.exit(1)
else:
filename = sys.argv[1]
filename_out = sys.argv[2]
tree = etree.parse(filename)
extract(tree)
input_file = open(filename, 'rU')
change_class(input_file)
file_new = open(filename_out, 'w')
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
现在我应该以某种方式使用标准输入和标准输出而不是我的参数,以使我的脚本在管道中可用,例如使用多个文件作为输入:
cat 输入1 输入1 输入3 |我的脚本.py
或者在将其打印到文件之前使用一些 UNIX 工具处理其输出。 我试图用 sys.stdin 替换脚本中的参数:
filename = sys.stdin
filename_out = sys.stdout
然后我像这样运行我的脚本:
./myscript.py 输出文件
它导致一个空的输出文件,但根本没有产生任何错误消息。
您能帮我解决这个问题吗?
附:然后我像这样修改了我的 main():
filename = sys.argv[1]
filename_out = sys.argv[2]
if filename == '-':
filename = sys.stdin
else:
input_file = open(filename, 'rU')
if filename_out == '-':
filename_out = sys.stdout
file_new = filename_out
else:
file_new = open(filename_out, 'w')
tree = etree.parse(filename)
extract(tree)
input_file = filename
change_class(input_file)
for x in newlist:
if '\n' in x:
x = x.replace('\n', '')
print>>file_new, x
我尝试像这样从命令行运行它:
./myscript.py - - volumeid < filein > fileout
但我仍然得到一个空的输出文件:(
【问题讨论】:
-
您可能会发现
fileinput模块很有用(在标准库中)。 -
@cdarke:
fileinput非常适合您只有输入文件的情况。您仍然需要手动处理命令行参数并传入fileinput应明确视为输入的文件。