我想编写一个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放入我的首选路径,并将errorstream放到where。最后,我从列表中删除作业并从头开始。在
我现在的问题是,stdout=open(path,“w”)似乎有点损坏,因为我无法访问甚至删除它,但我可以在文件夹中看到它。在
也许你们知道我做错了什么。在
谢谢你的努力!在
不间断
PS:也许我还应该补充一下,c++程序运行的时间更长。所以我有意要做的就是让程序执行nohup./c++[参数]并将输出流到一个特定的文件中,就像我在控制台中键入它一样。在
PPS:我希望能够在其他程序仍在运行时启动多个c++程序,直到cpu达到100%的使用率。在
问题是
path = f.readline()
返回一个结尾带有换行符的字符串。open(path, 'w')
在某些系统上,它不关心并在文件末尾创建一个换行符。{{cd3>中的要修复它,只需删除换行符:
path = path.strip()
。在您的代码中还有其他不相关的问题:
您正在混合制表符和空格进行缩进。永远不要这样做:这会使视觉缩进与Python当前在您的问题中看到的不同。要么总是使用制表符或空格,而不是两者都使用。您可以将编辑器配置为在按Tab键时插入4个空格。
您可能是指},它会无缘无故地增加循环的每次迭代
cpuLoad = psutil.cpu_percent()
而不是{从命令中删除换行符并删除
shell=True
。除非有必要,否则不要使用shell(这是一个好习惯,如果你知道自己在做什么,有时可能会被打破):使用
^{pr2}$with
-语句使代码与其他Python实现(如Jython、Pypy)兼容:否则,文件可能在父进程中保持打开状态。
在关闭 文件本身,即使它的目的是发生异常 存在的理由。
.close()
在这方面是无害的,但毫无意义 案例使用
if not first_line.strip():
测试第一行是否为空白(只包含空白)手工编辑
JobQueue.txt
的整个想法是脆弱的。什么也不能阻止Python进程只读部分输入。您可以使用专用命令添加新的作业,例如,at
-类似的实用程序。并以您喜欢的方式实现它,例如,在一个端口上监听主脚本中的新作业,并在类似at
的实用程序中发送作业。下面是一个the very basic socket client and server in Python的代码示例。或使用其他IPC方法。相关问题 更多 >
编程相关推荐