python子进程中stdout的文件已损坏

2024-04-23 14:40:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个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%的使用率。在


Tags: 文件pathimport程序txttrueaswith
1条回答
网友
1楼 · 发布于 2024-04-23 14:40:49

My Problem now is, that the stdout=open(path,"w") seems to be sort of corrupt, because I can't access or even delete it, but I can see it in the folder.

问题是path = f.readline()返回一个结尾带有换行符的字符串。open(path, 'w')在某些系统上,它不关心并在文件末尾创建一个换行符。{{cd3>中的

要修复它,只需删除换行符:path = path.strip()。在


您的代码中还有其他不相关的问题:

  • 您正在混合制表符和空格进行缩进。永远不要这样做:这会使视觉缩进与Python当前在您的问题中看到的不同。要么总是使用制表符或空格,而不是两者都使用。您可以将编辑器配置为在按Tab键时插入4个空格。

  • 您可能是指cpuLoad = psutil.cpu_percent()而不是{},它会无缘无故地增加循环的每次迭代

  • 从命令中删除换行符并删除shell=True。除非有必要,否则不要使用shell(这是一个好习惯,如果你知道自己在做什么,有时可能会被打破):

    import shlex
    
    process = Popen(shlex.split(command),
                    stdout=output_file, stderr=stderr_file)
    
  • 使用with-语句使代码与其他Python实现(如Jython、Pypy)兼容:

    ^{pr2}$

    否则,文件可能在父进程中保持打开状态。

  • 在关闭 文件本身,即使它的目的是发生异常 存在的理由。.close()在这方面是无害的,但毫无意义 案例

  • 使用if not first_line.strip():测试第一行是否为空白(只包含空白)

  • 手工编辑JobQueue.txt的整个想法是脆弱的。什么也不能阻止Python进程只读部分输入。您可以使用专用命令添加新的作业,例如,at-类似的实用程序。并以您喜欢的方式实现它,例如,在一个端口上监听主脚本中的新作业,并在类似at的实用程序中发送作业。下面是一个the very basic socket client and server in Python的代码示例。或使用其他IPC方法。

相关问题 更多 >