将shell命令包含到程序python中

时间:2014-03-18 10:05:00

标签: python

社区

我目前正在尝试实现一个包含以下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是我要运行的程序,-ltagged是程序的选项,我想在raw_text_de0.txt中输入并写入结果到另一个文件raw_text_de0_parsed.txt

问题是,我必须执行此操作超过400次(对于文件raw_text_de1.txtraw_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'])

然而,这不起作用。它显然调用了程序,但后来卡住了。我知道如果不能尝试就很难回答这个问题,但我希望有人知道可能出现的问题或遗漏。

2 个答案:

答案 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!"])

详细信息可以在这里找到:

subprocess doc

答案 1 :(得分:1)

subprocess.call有两个参数:stdinstdout。利用它们而不是将重定向运算符><放在参数中。

在你的情况下:

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()