2
votes

Comment réparer ValueError: pas assez de valeurs pour décompresser (attendu 2, obtenu 1) en python?

Je souhaite surveiller l'utilisation de la RAM de mon conteneur docker. Maintenant, j'ai trouvé un script en ligne qui génère un fichier txt avec les statistiques comme ceci:

var i

Faites-le fonctionner au démarrage avec mon Synology NAS. Fonctionne bien Je reçois ce fichier:

Traceback (most recent call last):
  File "/stats/genstat.py", line 22, in <module>
    name, stats = line.strip().split(',')
ValueError: not enough values to unpack (expected 2, got 1)

Maintenant, pour en faire un joli PNG, j'ai ce qui suit:

from pip._internal import main
main(["install", "matplotlib", "numpy","pandas"])

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

log_path = "/stats/docker-logs.txt"

with open(log_path) as f:
    raw_data = f.readlines()
nrows = 8
n = len(raw_data) // nrows
data = []
for i in range(n):
    start = i * nrows
    end = start + nrows - 1
    d = raw_data[start:end]
    datum = {}
    datum['i'] = i
    for line in d:
        name, stats = line.strip().split(',')
        stats = float(stats.split('/')[0].strip()[:-3])
        datum[name] = stats
    data.append(datum)

data = pd.DataFrame(data)
data['time (hour)'] = data['i'] * 10 / 60
ax = data.drop(columns='i').set_index('time (hour)').plot()
ax.set_ylabel('RAM Usage (MiB)')
ax.figure.savefig('/stats/plot.png')

Ce qui a bien fonctionné au début, mais à l'improviste, cela a cessé de fonctionner et j'ai eu l'erreur suivante:

-
Python3, 46.42MiB / 150MiB
hassio, 160.8MiB / 3.855GiB
Jacket, 255.4MiB / 3.855GiB
Radarrnodebug, 96.87MiB / 3.855GiB
Sonarrnodebug, 112.8MiB / 3.855GiB
Ombii, 212.2MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-
Python3, 46.42MiB / 150MiB
hassio, 68.34MiB / 3.855GiB
Jacket, 258.3MiB / 3.855GiB
Radarrnodebug, 101.8MiB / 3.855GiB
Sonarrnodebug, 114.8MiB / 3.855GiB
Ombii, 212.4MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-
Python3, 46.42MiB / 150MiB
hassio, 71.06MiB / 3.855GiB
Jacket, 262.7MiB / 3.855GiB
Radarrnodebug, 102.2MiB / 3.855GiB
Sonarrnodebug, 124.1MiB / 3.855GiB
Ombii, 217.7MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-
Python3, 46.42MiB / 150MiB
hassio, 81.38MiB / 3.855GiB
Jacket, 262.7MiB / 3.855GiB
Radarrnodebug, 102.5MiB / 3.855GiB
Sonarrnodebug, 125.1MiB / 3.855GiB
Ombii, 217.6MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-
Python3, 46.42MiB / 150MiB
hassio, 76.55MiB / 3.855GiB
Jacket, 269.2MiB / 3.855GiB
Radarrnodebug, 103.3MiB / 3.855GiB
Sonarrnodebug, 123.8MiB / 3.855GiB
Ombii, 219MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-
Python3, 46.42MiB / 150MiB
hassio, 77.52MiB / 3.855GiB
Jacket, 268.4MiB / 3.855GiB
Radarrnodebug, 106.2MiB / 3.855GiB
Sonarrnodebug, 117.8MiB / 3.855GiB
Ombii, 213.1MiB / 3.855GiB
watchtower, 11.48MiB / 50MiB
-

J'ai effectué un débogage et j'ai découvert que

LOG_FILE="/volume1/docker/docker-logs.txt"

while true;
do
    sleep 10m
    docker stats --format "{{.Name}}, {{.MemUsage}}" --no-stream >> $LOG_FILE
    #echo "-" >> $LOG_FILE
done

est devenu 0 donc plus rien n'a fonctionné (puisqu'il doit sauter le caractère "-") que s'est-il passé et comment puis-je le réparer? J'ai déjà beaucoup essayé en supprimant le caractère "-", en changeant les nrows mais rien n'a vraiment d'importance (pour meeeee)

J'espère que certains pourront vous aider


0 commentaires

3 Réponses :


2
votes

Cette ligne

columns = line.strip().split(',')
if len(columns) == 2:
    name, stats = columns
else:
    print("Expected name and stats, got", columns)

échoue car votre fichier d'entrée contient une ligne sans virgule. Et c'est très probablement une ligne vierge à la fin. Faites

name, stats = line.strip().split(',')


1 commentaires

L'erreur d'impression était un espace réservé pour montrer que quelque chose n'allait pas avec l'entrée. Je ne pouvais pas deviner comment vous vouliez y répondre.



0
votes

Essayez ceci:

if line.count(',') != 1:
    continue
name, stats = line.strip().split(',')


3 commentaires

si une ligne contient plus d'une virgule, elle la sautera


La décompression de @IjazAhmadKhan échoue lorsqu'il n'y a pas assez de valeurs ou trop


oui, peut capturer tout le reste dans l'état en utilisant * state



1
votes

C'est plus pythonique:

if ',' not in line:
    continue
name, stats = line.strip().split(',')


0 commentaires