2009-03-11 6 views
0

En python, j'essaye d'écrire un script qui va éditer des fichiers texte et ensuite exécuter des exécutables qui utilisent ces fichiers texte. Cela implique essentiellement 1) l'ouverture et la lecture/écriture dans un fichier texte, et 2) l'utilisation du fichier que je viens d'écrire dans une commande bash. Voici un exemple simple:python: problème lors de l'utilisation de call.subprocess pour utiliser un fichier après l'avoir écrit

import subprocess 

# write file 
a = ['1\n','2\n','3\n','4\n','5th and final line'] 
f = open('junk01.txt', 'wb') 
f.writelines(a) 
f.close 

# show file 
subprocess.call('cat junk01.txt', shell=True) 

Pour une raison quelconque sur cette commande subprocess.call il ne montre pas le contenu du fichier junk01.txt. Cependant après avoir exécuté ce code et tapez cat junk01.txt dans bash le fichier a été écrit correctement. De même, je découvre qu'après avoir ouvert, écrit et fermé un fichier texte, puis essayé de l'utiliser dans un exécutable, le fichier n'a pas encore été écrit. Toute explication sur pourquoi c'est et ce que je peux faire pour le réparer?

Répondre

9

Fermez le fichier en appelant la méthode close(). Cela videra implicitement les tampons sur le disque.

f.close() 

plutôt que

f.close  #this probably doesn't do anything, but if there was no close method it would raise an error. 
+0

Est-ce que tout mon problème était? Wow, je me sens comme un idiot. Je l'ai essayé et bien sûr, ça marche. C'est ce que je fais pour essayer de faire quelque chose de complexe dans une langue que je viens d'apprendre la semaine dernière ... Merci! –

+0

Oublier de rincer la sortie m'a pris des années après que j'aurais dû "mieux connaître" - j'ai le sentiment que c'est une erreur commune. –

+0

f.close fait quelque chose. Je localise la fonction de méthode proche. Ne l'évalue pas, mais au moins le trouve. –

0

Bien que la première réponse est certainement correcte et appropriée, vous pouvez aussi simplement mettre f sur Aucun au lieu de se se fait comme suit:

import subprocess 

# write file 
a = ['1\n','2\n','3\n','4\n','5th and final line\n'] 
f = open('junk01.txt', 'wb') 
f.writelines(a) 
f = None 
# show file 
subprocess.call('cat junk01.txt', shell=True) 

~

La définition de f sur None met la variable hors service et provoque la fermeture du fichier. mplicitement au lieu d'être explicitement fermé (comme dans le premier exemple préféré) Je ne préconise pas ce style de code d'écriture comme c'est un peu bâclé, je le mentionne juste comme une solution alternative.

[[email protected] ~/test/stack]$ python 1.py 
1 
2 
3 
4 
5th and final line 
[[email protected] ~/test/stack]$ 
Questions connexes