[英]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.