为什么写"from os import path.isfile, path.isdir, scandir"无效?



除了像这样分两行写,还有别的方法吗?

from os.path import isfile, isdir
from os import scandir # or import os.scandir

TL;DR你不能。如果你想从os.path内部导入函数/对象,你只能使用from os.path import <stuff>方法。


当您使用import导入东西时,您只能导入模块(模块是包含python对象的python文件的术语)。要导入模块内的对象,您使用from遍历到该模块,然后使用import <whateverObject>从该文件导入该对象(任何东西都是python中的对象,只要它位于.py文件内)。您使用的.(通常)遍历包内的目录('子'包?)

解释器如何知道包中包含哪个目录,或者如何将给定的目录识别为包?它在其中查找__init__.py文件。如果它找到一个,它就是一个包,因此你可以导入它。

如果单独使用,import最多只能访问directoriesmodules。当您使用from <module_or_directory> import <objects>时,访问目录和/或模块的任务被移交给from之后的子句,import之后的子句接管在模块内部查找python对象的任务。您可以看到,这是两件截然不同的事情—1)访问文件/目录,它属于文件系统;2)访问文件的内容,(特别是.py文件),它属于python的域—在from-import风格的导入中整齐地分开。


os模块的情况下,os.path是另一个.pyi文件(在Windows上为ntpath.pyi),在os.py文件中别名为path。因为它是一个模块,所以它放在from os.path import isfile, isdirfrom之后的子句中。而scandiros模块中的函数,因此它位于from os import scandirimport之后的子句中。

最新更新