【发布时间】:2014-04-26 11:10:42
【问题描述】:
我想编写一个 python 脚本,该脚本从作业列表中运行多个 c++ 程序。
我认为它工作正常,但我的输出文件有问题,它似乎已损坏或其他什么。反正我打不开。也许你们可以帮助我。
import multiprocessing
import psutil
import subprocess
import time
jobs2Do = True
while (jobs2Do): #Ever-running program
cpuLoad = cpuLoad + psutil.cpu_percent()
if (cpuLoad < 90):
with open('JobQueue.txt', 'r') as f:
first_line = f.readline()
path = f.readline()
f.close()
if (first_line != ""):
print "Opening " + first_line
process = subprocess.Popen( first_line, shell=True, stdout=open(path,"w"),stderr=open("error.log","w"))
with open('JobQueue.txt', 'r') as fin:
data = fin.read().splitlines(True)
with open('JobQueue.txt', 'w') as fout:
fout.writelines(data[2:])
with open("JobsDone.txt", "a") as myfile:
myfile.write(first_line)
myfile.write(path)
myfile.close()
else:
print "No more jobs... waiting for new jobs...."
time.sleep(10)
好的,所以我(想要)做的是:我检查 cpu 是否有一些空闲容量,如果有,打开带有作业的文件并获取命令,该命令位于该文件的第一行,以及程序的所有输出应保存到的路径。这总是在文件的第二行。
然后我想打开那个子进程,把标准输出放到我的首选路径,然后把错误流放到任何地方。最后,我从列表中删除作业并从头开始。
我现在的问题是,stdout=open(path,"w") 似乎有点损坏,因为我无法访问甚至删除它,但我可以在文件夹中看到它。
也许你们有一个想法,我做错了什么。
感谢您的努力!
NonStopAggroPop
PS:也许我还应该补充一点,c++ 程序运行时间更长。所以我有意要做的就是让程序执行 nohup ./c++ [arguments] 并将输出流式传输到特定文件,就像我在控制台中键入它一样。
PPS:我希望能够在其他程序仍在运行时启动多个 c++ 程序,直到我的 cpu 达到 100% 使用率。
【问题讨论】:
-
当然可以去掉c++标签?
-
是的,你是对的,标签被建议了,但主要是它的一个 python 问题。对不起!
-
也许子流程还在工作?尝试将
process.communicate()放在process = subprocess.Popen(...行之后。它将等待子进程终止。 -
你不必关闭文件,如果你用 with 打开它们。您无需等待该过程,这可能会带来一些释放资源的问题,例如关闭文件。
-
你在哪里填写 JobQueue?在没有前两行的情况下读取整个文件和回写之间存在竞争条件。
标签: python subprocess stdout