【问题标题】:Script only runs once, even though I'm using "while(True)"脚本只运行一次,即使我使用的是“while(True)”
【发布时间】:2015-08-06 14:51:05
【问题描述】:

我正在编写一个 Python 脚本,该脚本进入给定目录并根据修改日期删除文件。我已经完成了大部分工作(令人惊讶!),除了我发现了一个错误。让我让大家深入了解我的程序是如何工作的。

因此,如果用户请求程序安静地运行,我会将所有 stdout 和 stderr 信息重定向到临时文件夹中的临时文本文件。工作得很好。还有一个选项可以连续运行脚本。我使用了一个简单的 while(True) 循环来完成此操作。连续运行一切正常,花花公子,直到我想在每次循环后删除那个临时文件夹。这是我的主要功能中的代码:

    while(True):

        display()
        verifyDirectory()
        checkArgs()            
        # Deleting the temporary folder after each loop:
        if args.q:
            deleteTempFolder()

再次,一切正常,直到我尝试在每次循环后删除临时文件夹。程序基本上在第一个循环完成后停止。下面是deleteTempFolder()下的代码:

# Closing the redirected text files.
sys.stdout.close()
sys.stderr.close()

# Defining the paths for the temp folder and the existing text files.
folder = args.directory + "\\" + "temp"
stdoutPath = folder + "\\" + "stdout.txt"
stderrPath = folder + "\\" + "stderr.txt"

# Deleting the text files first, then deleting the entire temporary folder.
os.remove(stdoutPath)
os.remove(stderrPath)
os.rmdir(folder)

我还应该注意,以上所有代码都可以单独运行,但是当我将两者结合起来(连续运行并删除临时文件夹)时,我注意到我打破了循环。

此外,不会产生任何错误或异常。我可以通过将 stderr 文件重定向到另一个位置来检查它,因此在我运行代码时它不会被删除。

我希望所有这些都有意义。这是我第一次在这里提出问题,这是我编写的第一个脚本,它不是用于课程的愚蠢的 Java 视频游戏。我希望稍后发布整个脚本以获取有关效率的建议!

【问题讨论】:

  • 您是否在每个循环开始时重新创建文件夹?否则它可能会失败,因为你试图删除不存在的东西。
  • 我的主要怀疑是生成了一个异常正在,但由于某种原因它没有出现在您的重定向标准错误中。你能删除任何修改sys.stdoutsys.stderr的东西,看看控制台上的输出是什么?
  • 哇!你们真快! @Dannnno:调用 checkArgs() 函数时确实会重新创建该文件夹。当我不调用 deleteTempFolder() 时,程序会连续运行,只是一遍又一遍地附加到同一个文件中。如果我让程序运行几分钟,stdout.txt 文件会变得相当大。所以,我认为在每个循环之后删除会更有效。我想知道我是否应该在这里发布整个脚本,但我认为这可能是不行的。
  • @Kevin:删除任何修改它们的东西?你的意思是我不应该暂时不重定向它们吗?也许只是删除一个空的空白文件夹?抱歉,我没有关注...
  • @Dannnno :事实证明你是对的。我没有在循环中重新创建文件夹。一旦我能够看到正在生成的错误,我就会将我的问题追溯到那个“新手”错误。非常感谢!

标签: python while-loop


【解决方案1】:

由于错误流已关闭,可能会引发异常但未显示。试试这段代码 (python boom.py) 并注释掉 sys.stderr.close() 行:

import sys

print("Hello, world")

# this will prevent displaying the exception
sys.stderr.close()

# NameError: name 'nosuchfunction' is not defined
nosuchfunction

print("Goodbye, world")

【讨论】:

  • 好的,我现在看到了一些例外情况。当我保留 sys.stdout.close() 行时,我得到“对已关闭文件的 I/O 操作”。当我注释掉该行时,我得到“该进程无法访问该文件,因为它正在被另一个进程使用”。我注意到当我保留 os.remove(stdoutPath) 和 os.rmdir(folder) 时会发生此错误。没有这三行,代码可以正常工作......减去它实际上并没有做我想要的事实,哈哈 :)
  • 这很有帮助,谢谢!我能够看到异常,我发现了我的问题!
【解决方案2】:

感谢这里的所有反馈,我找到了解决问题的方法。事实证明,我的程序正在生成错误,但直到我注释掉 sys.stderr.close() 后我才能看到。一旦我看到程序崩溃的位置和时间,我发现我从来没有在循环中重新创建临时文件夹,这有点尴尬!感谢所有的反馈!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2021-08-24
    • 2021-04-04
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多