- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我一直在编写与扫描目录有关的脚本,并在调用 os.path.isdir 时注意到严重的内存泄漏,因此我尝试了以下代码段:
def func():
if not os.path.isdir('D:\Downloads'):
return False
while True:
func()
在几秒钟内,Python 进程达到了 100MB RAM。
我正试图弄清楚发生了什么。似乎只有当路径确实是有效的目录路径时,巨大的内存泄漏才有效(这意味着不执行“return False”)。此外,看看相关调用中发生了什么也很有趣,比如 os.path.isfile。
想法?
编辑:我想我在做某事。虽然 isfile 和 isdir 是在 genericpath 模块中实现的,但在 Windows 系统上 - isdir 是从内置的 nt 中导入的。所以我不得不下载 2.7.3 的源代码(我早就应该这样做了……)。
经过一番搜索,我发现\Modules\posixmodule.c中的posix__isdir函数,我认为是从nt导入的'isdir'函数。
这部分功能(和评论)引起了我的注意:
if (PyArg_ParseTuple(args, "U|:_isdir", &po)) {
Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
attributes = GetFileAttributesW(wpath);
if (attributes == INVALID_FILE_ATTRIBUTES)
Py_RETURN_FALSE;
goto check;
}
/* Drop the argument parsing error as narrow strings
are also valid. */
PyErr_Clear();
看来这一切都归结为 Unicode/ASCII 处理错误。
我刚刚用 unicode 中的路径参数尝试了上面的代码片段(即 u'D:\Downloads') - 没有任何内存泄漏。哈哈。
最佳答案
根本原因是在非Unicode路径中的path
变量上调用PyMem_Free
失败:
if (!PyArg_ParseTuple(args, "et:_isdir",
Py_FileSystemDefaultEncoding, &path))
return NULL;
attributes = GetFileAttributesA(path);
if (attributes == INVALID_FILE_ATTRIBUTES)
Py_RETURN_FALSE;
check:
if (attributes & FILE_ATTRIBUTE_DIRECTORY)
Py_RETURN_TRUE;
else
Py_RETURN_FALSE;
根据 PyArg_ParseTuple
上的文档:
et
: Same ases
...es
:PyArg_ParseTuple()
will allocate a buffer of the needed size, copy the encoded data into this buffer and adjust *buffer to reference the newly allocated storage. The caller is responsible for callingPyMem_Free()
to free the allocated buffer after use.
这是 Python 标准库中的一个错误(在 Python 3 中通过直接使用字节对象修复);在 http://bugs.python.org 提交错误报告.
关于python - 重复 os.path.isdir 调用中的巨大内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648737/
下面是列出文件夹内容的简单过程: def some_process(self): dir3 = os.listdir('/Users/somepath/programming/somepath
我有一些代码遍历目录以获取文件,对它们进行操作,它使用 IsDir() 跳过目录。但是,未正确检测到目录: err = filepath.Walk(dir, func(path string, f o
这个问题已经有答案了: Python not recognising directories os.path.isdir() [duplicate] (3 个回答) 已关闭 7 年前。 所以我在运行
我对 Qt 类 QFileInfo 有疑问,这里是一些代码示例 QString path = "C:\\Some\\Path"; QFileInfo pathFileInfo(path); if
这个问题在这里已经有了答案: Can't Open files from a directory in python [duplicate] (1 个回答) 关闭2 年前。 我有以下 Python
我有一个目录列表(purple、blue、red),可以在名为 colors< 的主目录中识别. 当我从 colors 中运行此脚本时: path_to_folders = './' folders
我的 Python 脚本试图打开一个县名文件,一次读取一个,然后找到一个具有相同名称的文件夹。我正在使用 isdir 来确保该目录首先存在。 print testpath 语句向我显示了正在测试的内容
假设我有这样的目录: foo/bar/ bar 是 chmod 777 而 foo 是 000。 当我调用 os.path.isdir('foo/bar') 时,它只返回 False,没有任何 Per
我正在用 python 编写自己的 shell。现在我正在尝试对我的 shell 执行 cd 命令。 执行这个命令的函数有几个变量: self.current_dir = "C:\\" - 默认值,它
文件 f 是否有可能 os.path.isfile(f) 和 os.path.isdir(f) 同时存在评估为假? 在这种情况下,第三个类别将被命名为什么? 场景:我在 ubuntu 18.04 上使
Windows 7、 python 2.6.6、2.7 创建目录“c:\1\test”。 尝试检查它是目录还是文件,但两者都不是: >>> os.listdir('c:/1') ['test.'] >
我一直在编写与扫描目录有关的脚本,并在调用 os.path.isdir 时注意到严重的内存泄漏,因此我尝试了以下代码段: def func(): if not os.path.isdir('D
我想要实现类似的目标 {% for file in fileList %} {% if file isfile %} {{file}} {%
我有以下代码检查目录是否存在 def download(id, name, bar): cwd = os.getcwd() dir = os.path.join(cwd,bar)
我们在 Windows 上使用 os.path.isdir() 方法时遇到了非常缓慢的性能。检查大量文件时,在 osx 下相同的功能运行时间为 0.3 秒,而在 windows 下运行时间为 1.8
我目前正在编写一个脚本,它必须检查所有指定的文件夹是否确实存在。我发现我必须将 os.path.isdir() 与绝对路径一起使用。 我有以下目录结构: X:\ pythonscripts\
编写脚本以将日志文件从一台服务器检索到 NAS,我需要确定某物是文件还是目录。有谁知道一种简单的方法来确定 ftp.nlst() 的元素是文件还是目录? 提前致谢 最佳答案 考虑 here 中的以下代
我正在(向上)遍历目录树,我需要找到所有目录。但是 os.listdir() 的输出, 当与 os.path.isdir() 组合时不是我所期望的。 例如,这只显示了两个目录(bin 和 dev):
我正在构建一个 Python ISO 生成应用程序,并且我从 os.path.isdir() 获得了一些奇怪的输出。我正在使用 Python 2.7.1 运行 Arch Linux。 我有以下文件夹结
我正在检查目录是否存在,但我注意到我使用的是 os.path.exists 而不是 os.path.isdir。两者都工作得很好,但我很好奇使用 isdir 而不是 exists 有什么优势。 最佳答
我是一名优秀的程序员,十分优秀!