簡體   English   中英

python子進程中stdout的損壞文件

[英]Corrupt file for stdout in python subprocess

我想編寫一個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放到我的首選路徑中,並將錯誤流放到任何地方。 最后,我從列表中刪除作業,然后從頭開始。

我的問題現在是,stdout = open(path,“ w”)似乎已損壞,因為我無法訪問甚至刪除它,但可以在文件夾中看到它。

也許你們有個主意,我做錯了什么。

謝謝你的努力!

NonStopAggroPop

PS:也許我還應該補充一點,C ++程序運行時間更長。 因此,我有意要做的就是讓程序執行nohup ./c++ [arguments]並將輸出流式傳輸到特定文件,就像在控制台中鍵入該文件一樣。

PPS:我希望能夠在其他C ++程序仍在運行時啟動多個c ++程序,直到我的cpu達到100%使用率為止。

我的問題現在是, stdout=open(path,"w")似乎已損壞,因為我無法訪問甚至刪除它,但可以在文件夾中看到它。

問題是path = f.readline()返回結尾處帶有換行符的字符串。 某些系統上的open(path, 'w')無關緊要,並在文件末尾添加換行符。 嘗試使用print(os.listdir('.'))在文件名中看到\\n

要解決此問題,只需刪除換行符: path = path.strip()


您的代碼中還有其他不相關的問題:

  • 您正在混合制表符和空格以進行縮進。 永遠不要那樣做:它使視覺縮進不同於您當前在問題中所看到的那種。 請始終使用制表符或空格,而不要同時使用兩者。 您可以將編輯器配置為在按Tab鍵時插入4個空格。

  • 您可能是說cpuLoad = psutil.cpu_percent()而不是cpuLoad = cpuLoad + psutil.cpu_percent()cpuLoad = cpuLoad + psutil.cpu_percent()增加循環的每次迭代

  • 從命令中刪除換行符,然后刪除shell=True 除非必要,否則不要使用shell(這是一個好習慣,如果您知道自己在做什么,有時可能會被破壞):

     import shlex process = Popen(shlex.split(command), stdout=output_file, stderr=stderr_file) 
  • with -statement一起使用with以使代碼與其他Python實現(例如Jython,Pypy)兼容:

     with open(path, 'w') as output_file: with open('error.log', 'w') as stderr_file: process = Popen(shlex.split(command), stdout=output_file, stderr=stderr_file) 

    否則文件可能在父進程中保持打開狀態。

  • 使用f.close()刪除f.close()myfile.close()之后, with自行關閉文件,即使發生異常是其目的,即存在的理由。 .close()是無害的,但在這種情況下毫無意義

  • if not first_line.strip():使用if not first_line.strip():測試第一行是否為空白(僅包含空白)

  • 手動編輯JobQueue.txt的整個想法很脆弱。 沒有什么能阻止Python進程僅讀取部分輸入。 您可以使用專用命令來添加新作業,例如at -like實用程序。 並根據自己的喜好實現它,例如,在主腳本中偵聽端口上的新作業,然后at -like實用程序中發送作業。 這是Python中非常基本的套接字客戶端和服務器的代碼示例。 或使用其他IPC方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM