Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/09/2012, à 14:17

amj

[RESOLU] supprimer des lignes d'un fichier avec python

bonjour à tous,
je suis en train d'écrire des fonctions en python qui servent à modifier le fichier /etc/fstab (servant à monter les partitions ou des dossiers) afin de faire un chroot.
J'ai déjà écrit la partie servant à rajouter les ligne:

def addtofstab (chrootlocation):
	with open("/etc/fstab", "a") as fstab: 
		fstab.writelines(
		"\n############################################ montages chroot \"liés\"\n"+
		"/tmp    "+chrootlocation+"/tmp        none    bind    0       0\n"+
		"/dev    "+chrootlocation+"/dev        none    bind    0       0\n"+
		"/proc   "+chrootlocation+"/proc       none    bind    0       0\n"
		) 

Mais je ne sait pas comment les supprimer par la suite.
II me faudrait donc trouver un code pour supprimer les 4 dernières lignes du fichier.
Merci d'avance.

Dernière modification par amj (Le 05/09/2012, à 15:40)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#2 Le 05/09/2012, à 15:06

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

Hé bien, c'est pas trop difficile.

def del_to_fstab():
    with open("/etc/fstab", "r") as fstab:
        # on récupère le contenu de fstab et on lui supprime 4 lignes
        fstab_str = ''.join(fstab.readlines()[:-4])

    with open("/etc/fstab", "w") as fstab:
        # on écrit la modification
        fstab.write(fstab_str)

C'est sans doute perfectible mais ça répond au besoin.

PS : attention aux éventuelles accents dans mes commentaires

Hors ligne

#3 Le 05/09/2012, à 15:12

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

merci
mais y a-t-il un risque que le fichier sois vide si le script est interrompu en plein milieu?


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#4 Le 05/09/2012, à 15:34

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

merci ça fonctionne


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#5 Le 05/09/2012, à 16:25

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

amj a écrit :

mais y a-t-il un risque que le fichier sois vide si le script est interrompu en plein milieu?

Ta remarque était pertinente.
L'option 'w' supprime tout le contenu du fichier avant.

Mes recherches m'ont amenées ici : http://stackoverflow.com/questions/2333 … ith-python

Pour garantir un transfert atomique (c'est à dire que si le script venait à être coupé, on aurait soit le fichier avant modification soit après mais pas entre 2), il faut utiliser un fichier temporaire puis utiliser "os.rename" qui lui est atomique.

Voici le résultat :

def del_to_fstab():
    with open("/etc/fstab", "r") as fstab:
        fstab_str = ''.join(fstab.readlines()[:-4])

    f = open('fstab_tmp', 'w')
    f.write(fstab_str)
    # make sure that all data is on disk
    # see http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
    f.flush()
    os.fsync(f.fileno())
    f.close()

    os.rename('fstab_tmp', 'fstab')

Hors ligne

#6 Le 05/09/2012, à 21:30

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

merci
j'ai eu une autre idée
je vais faire une copie du fichier avant de le modifier
et après la remettre
je pence que c'est le plus sûr


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#7 Le 05/09/2012, à 21:55

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

dans ce cas là, tu peux utiliser :

import shutil

shutil.copy('fstab_tmp', 'fstab')

Hors ligne

#8 Le 05/09/2012, à 21:56

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

j'ai fait les modifications comme mis au dessus

import os

def addtofstab(chrootlocation):
	with open("test.txt", "a") as fstab:
		global fstab_str
		fstab_str = ''.join(fstab.readlines())
		fstab.writelines(
		"\n############################################ montages chroot \"liés\"\n"+
		"/tmp    "+chrootlocation+"/tmp        none    bind    0       0\n"+
		"/dev    "+chrootlocation+"/dev        none    bind    0       0\n"+
		"/proc   "+chrootlocation+"/proc       none    bind    0       0\n"
		) 
def ressetstab():
	with open("test.txt", "w") as fstab:
		global fstab_str
		fstab.write(fstab_str)

mais j'ai une erreur qui me reviens

chroot.addtofstab("/media/b__")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "chroot.py", line 8, in addtofstab
    fstab_str = ''.join(fstab.readlines())
io.UnsupportedOperation: not readable

pourriez vous me dire d'où viens l'erreur


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#9 Le 05/09/2012, à 22:06

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

C'est normal : vous tentez de lire le fichier alors qu'il est en écriture : "with open("test.txt", "a") as fstab:"

Si vous désirez récupérer avant de modifier

def addtofstab(chrootlocation):
       with open("/etc/fstab", "r") as fstab:
               global fstab_str
	       fstab_str = ''.join(fstab.readlines())

	with open("test.txt", "a") as fstab:

		fstab.writelines(
		"\n############################################ montages chroot \"liés\"\n"+
		"/tmp    "+chrootlocation+"/tmp        none    bind    0       0\n"+
		"/dev    "+chrootlocation+"/dev        none    bind    0       0\n"+
		"/proc   "+chrootlocation+"/proc       none    bind    0       0\n"
		) 

Maintenant, je déconseille vivement les variables globales.
Il vaut mieux passé des donnés en argument d'une fonction et/ou en sortie.

Hors ligne

#10 Le 05/09/2012, à 22:13

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

toujours la même erreur

chroot.addtofstab("/media/b__")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "chroot.py", line 8, in addtofstab
    fstab_str = ''.join(fstab.readlines())
io.UnsupportedOperation: not readable

et je suis en tant que root


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#11 Le 05/09/2012, à 22:19

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

c'est peut-être lié a ceci

fstab_str = ''.join(fstab.readlines()[:-4])

que j'ai transformé en

fstab_str = ''.join(fstab.readlines())

Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#12 Le 05/09/2012, à 22:25

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

en effet, un bête problème de copier/coller foireux.

Hors ligne

#13 Le 05/09/2012, à 22:25

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

c'est à dire
???

Dernière modification par amj (Le 05/09/2012, à 22:26)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#14 Le 05/09/2012, à 22:29

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

hum, j'ai du mal comprendre tes propos :

C'est normal que j'ai mis "fstab_str = ''.join(fstab.readlines())" plutôt que "fstab_str = ''.join(fstab.readlines()[:-4])" !
Quant est-il?

Hors ligne

#15 Le 05/09/2012, à 22:31

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

oui je sait d'ailleurs c'est moi qu'il ai fait


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#16 Le 05/09/2012, à 22:31

pingouinux

Re : [RESOLU] supprimer des lignes d'un fichier avec python

Bonsoir,
Est-ce que le fichier existe ?
D'autre part, les deux lignes suivantes sont équivalentes :

fstab_str = ''.join(fstab.readlines())
fstab_str = fstab.read()

Hors ligne

#17 Le 05/09/2012, à 22:34

moths-art

Re : [RESOLU] supprimer des lignes d'un fichier avec python

oui, en effet "pingouinux", readlines() n'a plus aucun intérêt...

Hors ligne

#18 Le 05/09/2012, à 22:42

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

oui le fichier existe
et le changement n'a rien ammélioré


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#19 Le 05/09/2012, à 22:46

pingouinux

Re : [RESOLU] supprimer des lignes d'un fichier avec python

Dans ton script du #8, tu ne donnes pas le chemin complet du fichier test.txt. Es-tu dans le bon répertoire quand tu appelles la fonction addtofstab ?

Hors ligne

#20 Le 05/09/2012, à 23:21

amj

Re : [RESOLU] supprimer des lignes d'un fichier avec python

j'ai mis la structure complète /home/... sans résultat


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#21 Le 06/09/2012, à 06:28

pingouinux

Re : [RESOLU] supprimer des lignes d'un fichier avec python

À tout hasard, pour voir si le fichier n'est pas mal orthographié :

ls -lb /home/...../test.txt
ls -lb /home/...../*.txt
ls -lb /home/...../test.*

Hors ligne