2

我有许多 python 脚本,我想背靠背传输大约 1000 次,更改每个脚本的输入文件

我以前使用 bash shell 脚本来执行此操作,但现在我需要它在 Windows 机器上工作。

这是python,有问题的行被注释掉了

namecount = 0
for file in files:
     in_filestring = "test_" + str(namecount)
     out_filestring = "out_ + str(namecount)
     namecount += 1
     #Run this on the command line: python pre.py < in_filestring | filter.py | a_filter.py > out_filestring

我可以在这里使用它还是有更好的方法?我问是因为我目前正在阅读子进程http://docs.python.org/2/library/subprocess.html。显然它取代了过时的 os.system,但我还不明白如何使用它。

import os
os.system('system command you want to run')
4

3 回答 3

1

subprocess.call 应该没问题。基本的是,

call(["args" in comma separated])

这是链接http://docs.python.org/2/library/subprocess.html#using-the-subprocess-module

在你的情况下,尝试这样的事情,

from subprocess import call
...
...
call(["python", "pre.py", "<", filestring, "|", "filter.py", "|", "a_filter.py", ">", "out_filestring"])
于 2013-06-29T06:24:49.330 回答
1

对于调用通过管道连接的多个程序,os.system是最简单的方法。您也可以使用subprocess.Popen,但是您必须自己连接输入和输出,如下所示:

p = subprocess.Popen("echo 'asdf'".split(), stdout=subprocess.PIPE)
q = subprocess.Popen("sed s/a/g/".split(), stdin=p.stdout, stdout=subprocess.PIPE)
q.stdout.read()

有一个类似问题的综合答案。

但是,由于您想调用 python 程序,您可以检查它们是否可以在您的进程中使用。

如果他们还没有这样做,您可以使用生成器作为输入和输出将它们转换为函数。然后你可以像这样连接它们:

output_file.writelines(a_filter(filter(pre(input_file)))

这样可以节省启动一千个进程的开销。作为奖励,您可以使用多处理模块的池来并行化您的工作负载。

于 2013-06-29T15:07:45.063 回答
0

os.system()有一个问题是它直接打印命令行输出,尽管您不希望它被打印。例如)

如果要执行ls命令并将输出保存到文件或变量中, system() 没有帮助。利用

波本

这个 Popen 真的让 os.system() 过时了。这有点难以理解,但它更有用。

于 2013-06-29T05:49:45.753 回答