2015-11-20 1 views
3

Je le code suivant:Fichier non prêt pour l'écriture après ouverture?

#!/usr/bin/python 

export = open('/sys/class/gpio/export', 'w') 
export.write('44\n') 

Et ce code produit la sortie suivante:

close failed in file object destructor: 
IOError: [Errno 16] Device or resource busy 

Si je change le code en ajoutant un export.close() à la fin, je reçois ce en sortie:

Traceback (most recent call last): 
    File "./test.py", line 5, in <module> 
    export.close() 
IOError: [Errno 16] Device or resource busy 

Cependant, si je change le code à nouveau en tant que tel, il fonctionne parfaitement:

#!/usr/bin/python 
from time import sleep 

export = open('/sys/class/gpio/export', 'w') 
sleep(1) 
export.write('44\n') 

Notez que .close TOUJOURS échoue, même si je mets un long sommeil après l'écriture.

Edit:

Changé mon code pour les suivantes:

with open('/sys/class/gpio/export', 'w') as export: 
    sleep(1) 
    export.write('44\n') 
    export.flush() 
    export.close() 

donne encore des erreurs:

Traceback (most recent call last): 
    File "./test.py", line 7, in <module> 
    export.flush() 
IOError: [Errno 16] Device or resource busy 

Edit 2:

Mon principal problème est avéré être que vous ne pouvez pas exporter un GPIO déjà exporté. J'ai mis à jour mon code pour ressembler à ceci et il semble fonctionner:

from os import path 

if not path.isdir('/sys/class/gpio/gpio44'): 
    with open('/sys/class/gpio/export', 'w') as export: 
     export.write('44\n') 

if path.exists('/sys/class/gpio/gpio44/direction'): 
    with open('/sys/class/gpio/gpio44/direction', 'w') as gpio44_dir: 
     gpio44_dir.write('out\n') 

if path.exists('/sys/class/gpio/gpio44/value'): 
    with open('/sys/class/gpio/gpio44/value', 'w') as gpio44_val: 
     gpio44_val.write('1\n') 

Ce code exporte avec succès un GPIO, définit sa direction à « sortir » et actifs qu'il (valeur 1).

+1

Ceci est un coup dans le noir, mais que faire si vous faites 'export.flush()' avant de fermer? – Kevin

+3

Est-ce que '/ sys/class/gpio/export' est un fichier normal? –

+1

Pourriez-vous essayer d'utiliser le gestionnaire de contexte python? comme ça: avec open ('/ sys/class/gpio/export', 'w') comme export: export.write (...) – Solo

Répondre

2

Mon problème principal s'est avéré être que vous ne pouvez pas exporter un GPIO qui a déjà été exporté. J'ai mis à jour mon code pour ressembler à ceci et il semble fonctionner:

from os import path 

if not path.isdir('/sys/class/gpio/gpio44'): 
    with open('/sys/class/gpio/export', 'w') as export: 
     export.write('44\n') 

if path.exists('/sys/class/gpio/gpio44/direction'): 
    with open('/sys/class/gpio/gpio44/direction', 'w') as gpio44_dir: 
     gpio44_dir.write('out\n') 

if path.exists('/sys/class/gpio/gpio44/value'): 
    with open('/sys/class/gpio/gpio44/value', 'w') as gpio44_val: 
     gpio44_val.write('1\n') 

Ce code exporte avec succès un GPIO, définit sa direction à « sortir » et actifs qu'il (valeur 1).

+1

Eh bien si rien d'autre vous obtenez le badge de mérite de dépannage. –