python脚本在python解释器中执行,失败为.py文件

问题描述 投票:1回答:1

我的剧本:

from os import walk, path, rename

def rename(source, dest):
    for root, sub, files in walk(source):
        for file in files:
            if file.endswith('.mp4'):
                nbase = file.split('.mp4')[0]
                newname = nbase[0:len(nbase) - 12] + '.mp4'

                nsource = path.join(root, file)
                rdest = path.join(dest,newname)

                rename(nsource,rdest)

s = '/Users/ja/Desktop/t'
d = '/Users/ja/Desktop/u'

rename(s,d)

这行脚本行将在ipython中运行,重命名并重定位文件而不会出现问题。当在sublimetext或textedit中编写脚本并保存时,它不会抛出任何错误,但什么也不做。我在macOS mojave上。

python-3.x macos-mojave
1个回答
1
投票

问题是你给你的函数命名为rename,但在函数内部你也试图使用名称rename来调用os.rename。结果是从未调用过os.rename。相反,您的函数使用旧的和新的文件名作为参数对其自身进行递归调用。

那个递归调用什么也没做,因为walk(source)在传递文件名时没有返回任何内容。最终结果是一个程序,它正确地遍历旧目录树,但从不对它在该树中找到的文件做任何事情。

要修复,请为您的函数指定一个不与os.rename冲突的名称。也许像rename_in_tree。或者,导入os.rename,其名称不是renamefrom os import rename as os_rename),并通过函数内部的新名称调用它。

我不知道这在ipython如何发生。 REPL处理程序有时会使用命名范围做一些奇怪的事情,但是它会以某种方式调用os.rename而不是对函数进行递归调用似乎很奇怪。

© www.soinside.com 2019 - 2024. All rights reserved.