【问题标题】:File not ready for write after open?打开后文件未准备好写入?
【发布时间】:2015-11-20 13:57:41
【问题描述】:

我有以下代码:

#!/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,将其方向设置为“out”,并将其激活(值为 1)。

【问题讨论】:

  • 这是在黑暗中刺伤,但如果你在关闭前export.flush() 呢?
  • /sys/class/gpio/export是普通文件吗?
  • 你可以尝试使用 python 上下文管理器吗?像这样:使用 open('/sys/class/gpio/export', 'w') 作为导出:export.write(...)
  • 如何将'w'模式改为'a'(追加)?
  • 在我的系统上,这个文件似乎是安装在FUSE 的虚拟文件系统的一部分,它具有特殊的访问权限限制(例如,参见here)。你可以lsofstat 这个文件正常吗?大概不会。您是否以挂载该文件系统的用户身份运行该程序(我假设为 root)?大概不会。

标签: python linux gpio file-access


【解决方案1】:

我的主要问题是您无法导出已导出的 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)。

【讨论】:

  • 如果没有其他问题,您将获得故障排除优点徽章。
猜你喜欢
  • 2015-07-12
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多