【问题标题】:Why doesn't my script write content to the file?为什么我的脚本不将内容写入文件?
【发布时间】:2018-11-06 13:00:08
【问题描述】:

我用 Python 编写了一个脚本,一旦我执行它并按下连接到我的 Raspberry Pi 上的 GPIO 的按钮,应该:

  • 打印“它有效!”
  • 创建一个名为“it_works.txt”的文件,内容为“耶!”

脚本确实打印出“它有效!”并创建文件,但是一旦我打开它,内容就会丢失。 这是脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO

# SET GPIO Button-Pin
gpio = 9

# Main Function
def main():
  value = 0

  while True:

    if not GPIO.input(gpio):
      value += 0.01

    if value > 0:

     if GPIO.input(gpio):
       print "it works!"
       with open("it_works.txt", "w") as file:
           file.write("yay!")
           main()

     time.sleep(0.03)

  return 0

if __name__ == '__main__':
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio, GPIO.IN)
main()

我没有使用 Python 的经验,所以我真的不能说我是否写错了。任何帮助将不胜感激,非常感谢!

【问题讨论】:

  • 缩进在 Python 中很重要。如果您要发布 Python 代码,请努力准确地重现您的缩进。如果读者必须尝试猜测您的实际缩进,他们可能会错过问题或在程序中引入新问题。
  • 你为什么在with open(...)块内再次调用main()

标签: python raspberry-pi gpio


【解决方案1】:

文件永远不会关闭,with 语句会打开文件进行写入,这就是为什么您会看到它被创建但在关闭之前您再次调用main(),在此过程中它会一次又一次地递归打开.

我不熟悉 GPIO 的工作原理,所以我不确定您的用例,但请尽量避免执行上述操作

【讨论】:

    【解决方案2】:

    看起来您试图再次在 with 语句中调用 main - 可以说是递归调用。

    你为什么又打电话给main

    此外,您可能想要做的是附加到现有文件 - 如果文件存在。这里建议使用模式“a”。

    【讨论】:

      【解决方案3】:

      我不知道RPi.GPIO包是什么,但我认为你在错误的地方一遍又一遍地使用main函数,建议你写完后关闭文件。使用下面的代码:

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      
      import time
      import RPi.GPIO as GPIO
      
      # SET GPIO Button-Pin
      gpio = 9
      
      # Main Function
      def main():
        value = 0
      
        while True:
      
          if not GPIO.input(gpio):
            value += 0.01
      
          if value > 0:
      
           if GPIO.input(gpio):
             print "it works!"
             with open("it_works.txt", "w") as file:
                 file.write("yay!")
                 file.close()
           main()
      
           time.sleep(0.03)
      
        return 0
      
      if __name__ == '__main__':
      GPIO.setmode(GPIO.BCM)
      GPIO.setup(gpio, GPIO.IN)
      main()
      

      【讨论】:

        【解决方案4】:

        使用您提供的当前 yìcode,您正确设置了 GPIO 的引脚,然后您的 main 进入一个循环,在该循环中它继续以“写入”模式打开文件,但您永远不会正确关闭它。在with 声明后添加file.close() 行:

        以 open("it_works.txt", "w") 作为文件:

            file.write("yay!")
        
            main()
        

        file.close()

        (注意压痕)

        此外,当您在 python 中使用 'w' 选项打开文件时,它会截断文件的内容。我不知道这是否与你有关。我建议使用“r+”或“a”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-03
          • 2011-07-04
          • 2017-02-21
          • 2014-02-28
          相关资源
          最近更新 更多