打开后文件未准备好写入?

3

I have the following code:

#!/usr/bin/python

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

而这段代码生成以下输出:

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

如果我在代码结尾处添加 export.close(),则会得到以下输出结果:
Traceback (most recent call last):
  File "./test.py", line 5, in <module>
    export.close()
IOError: [Errno 16] Device or resource busy

然而,如果我再次更改代码如下,它就完美地工作了:
#!/usr/bin/python
from time import sleep

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

请注意,即使我在写入操作后休眠很长时间,.close仍然会失败。
编辑:
我将我的代码更改为以下内容:
with open('/sys/class/gpio/export', 'w') as export:
    sleep(1)
    export.write('44\n')
    export.flush()
    export.close()

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

编辑2:

我的主要问题是您不能导出已经被导出的GPIO。我已经更新了我的代码,看起来像这样,现在它似乎可以工作了:

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')

这段代码成功地导出了一个GPIO,将其方向设置为“输出”,并激活它(值为1)。


1
这只是一种猜测,但如果在关闭之前执行 export.flush() 会怎样呢? - Kevin
3
/sys/class/gpio/export是一个普通文件吗? - Remi Guan
1
改成追加模式 'a' 怎么样? - Solo
1
这里的任何内容对您有帮助吗?(链接:http://unix.stackexchange.com/q/118716/62699) - Two-Bit Alchemist
1
还有一个澄清:您在root shell上运行echo 44 > /sys/class/gpio/export并且它可以工作吗?以及lsofstat?如果是这样,那么我的最佳建议是标记您在此设备上安装的特定Linux版本,以希望得到一些使用配置更接近您的系统的专家。但是,如果不是这样,我认为您需要将Python脚本作为您正在运行成功的普通命令的任何用户来运行,即使那是您的常规用户。 - Two-Bit Alchemist
显示剩余9条评论
1个回答

2

我的主要问题是已经导出的GPIO无法再次导出。我已更新我的代码,如下所示,似乎可以正常工作:

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')

这段代码成功地导出了一个GPIO,将其方向设置为“out”,并激活它(值设置为1)。

1
好吧,如果没有其他的收获,你至少会得到故障排除徽章。 - Two-Bit Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接