社区
我目前正在尝试实现一个包含以下shell命令的程序:
/home/myfolder/ParZu/parzu -l tagged < /home/myfolder/raw_text_de/raw_text_de0.txt >/home/myfolder/raw_text_de0_parsed.txt
/home/myfolder/ParZu/parzu
是我要运行的程序,-l
和tagged
是程序的选项,我想在raw_text_de0.txt
中输入并写入结果到另一个文件raw_text_de0_parsed.txt
。
问题是,我必须执行此操作超过400次(对于文件raw_text_de1.txt
,raw_text_de2.txt
....),这就是为什么我真的想要自动化它。
我在Stackoverflow上尝试了几个已经建议过的东西,但似乎都没有。我目前的尝试如下:
path_texts = '/home/myfolder/raw_text_de'
filename = os.listdir(path_texts)
##create list of filenames ('/home/myfolder/raw_text_de/raw_text_de0.txt', ...)
infile_list = []
for fname in filename:
new_filename = '/home/myfolder/raw_text_de/' + fname
infile_list.append(new_filename)
##go through the files in the infile_list and include it in shell command
for item in infile_list:
p = subprocess.call(['/home/myfolder/ParZu/parzu', '-l', 'tagged', '<', item, '>', item + 'parsed.txt'])
然而,这不起作用。它显然调用了程序,但后来卡住了。我知道如果不能尝试就很难回答这个问题,但我希望有人知道可能出现的问题或遗漏。
答案 0 :(得分:1)
如果你能在这里打印一些你的电话输出会更好。
但是,我猜问题出在你的调用参数中。
以下是 subprocess.call()
的正确参数列表subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
subprocess.call(["ls", "-l"])
您可以单独检查通话的返回结果,以确保其正常工作。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
subprocess.check_call(["ls", "-l"])
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
subprocess.check_output(["echo", "Hello World!"])
详细信息可以在这里找到:
答案 1 :(得分:1)
subprocess.call
有两个参数:stdin
和stdout
。利用它们而不是将重定向运算符>
和<
放在参数中。
在你的情况下:
for item in infile_list:
infile = file(item)
outfile = file(item + 'parsed.txt','w')
p = subprocess.call(['/home/myfolder/ParZu/parzu', '-l', 'tagged'], stdin=infile, stdout=outfile)
infile.close()
outfile.close()