为什么os.path.basename()使我的HTPC脚本失败?

时间:2012-10-21 06:47:58

标签: python

这里有完整的脚本:http://pastebin.com/d6isrghF

我会承认我是 非常 Python的新手,所以如果这是一个容易回答的问题,请原谅我的愚蠢。有问题的部分是:

sourcePath = jobPath
while os.path.basename(sourcePath):
    if os.path.basename(os.path.dirname(sourcePath)).lower() == category.lower():
        break
    else:
        sourcePath = os.path.dirname(sourcePath)
if not os.path.basename(sourcePath):
    print "Error: The download path couldn't be properly determined"
    sys.exit()

jobPath正在从sabnzbd提供给脚本,并且是:

/mnt/cache/.apps/sabnzbd/complete/name.of.folder

类别是:

tv

所以我想我的问题是:为什么这会因错误而失败?

1 个答案:

答案 0 :(得分:1)

为什么它不起作用

您的代码无法正常运行,因为在while未评估os.path.basename(sourcePath)之前执行True,然后调用if语句,因为它看起来像:{{ 1}})显然被评估为if not os.path.basename(sourcePath),因此显示了消息(您的“错误”):

带注释的源代码

True

何时(和为什么)它有时会起作用

有时只是因为在路径中找到了类别,这意味着sourcePath = jobPath # This is executed until os.path.basename(sourcePath) is evaluated as true-ish: while os.path.basename(sourcePath): if os.path.basename(os.path.dirname(sourcePath)).lower() == category.lower(): break else: sourcePath = os.path.dirname(sourcePath) # Then script skips to the remaining part, because os.path.basename(sourcePath) # has been evaluated as false-ish (see above) # And then it checks, whether os.path.basename(sourcePath) is false-ish (it is!) if not os.path.basename(sourcePath): print "Error: The download path couldn't be properly determined" sys.exit() 循环将被退出(使用while),即使仍然符合标准(之后的条件) break关键字:while)。因为仍然满足来自os.path.basename(sourcePath)循环的条件(即使满足循环,我们退出循环),不再满足下一个语句的条件(while)并且消息(“错误”)是没打印。

可能的解决方案

我相信其中一个解决方案是为您的代码添加一个计数器,只有在特定的迭代次数中,您才能找到所需的内容。您还可以尝试捕获“太多递归”异常(当然,如果您将使用递归,但错误将如下所示:not os.path.basename(sourcePath))。

但是,您应该重新设计它,以满足您自己的需求。