Windows环境Python3.9.6使用urllib模块的两个相关问题咨询
问题1:如何找到urllib未默认暴露的子模块
urllib作为标准库包,其根目录下的__init__.py默认仅主动导入了parse子模块,其余子模块不会在父包导入时自动加载,因此刚执行import urllib后调用dir(urllib)看不到request、error这类子模块。只有当你显式导入urllib.request等子模块时,对应模块才会被加载并绑定为父包的属性,出现在dir返回结果中。
无需查阅文档即可查询所有子模块的两种方法:
- 查看本地包文件:执行
print(urllib.__path__)获取urllib包在你电脑上的存储目录,打开该目录后,所有非__init__.py的.py文件、以及包含__init__.py的子文件夹,都是urllib的子模块/子包,去掉.py后缀就是模块名。 - 代码枚举:调用标准库
pkgutil的iter_modules方法直接枚举所有子模块,代码如下:
import pkgutil import urllib module_list = [mod_name for _, mod_name, _ in pkgutil.iter_modules(urllib.__path__)] print(module_list)
问题2:help(urllib)提示找不到more命令的原因
该报错和urllib模块本身无关,是help()函数底层调用系统分页工具失败导致的。help()输出长文本时会默认调用系统自带的分页工具做内容拆分显示,Windows系统下默认调用的是C:\Windows\System32目录下的more.com程序。如果你的系统环境变量PATH中没有添加C:\Windows\System32路径,系统就无法找到该命令,触发报错。
你可以直接打开CMD执行more验证,如果CMD也报相同错误,将C:\Windows\System32添加到系统环境变量PATH中,重启终端后即可正常使用help()功能。
问题复现代码
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import urllib >>> help(urllib) 'more' 不是内部或外部命令,也不是可运行的程序或批处理文件。 >>> dir(urllib) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'parse'] >>> import urllib.request >>> dir(urllib) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'error', 'parse', 'request', 'response'] >>>
内容的提问来源于stack exchange,提问作者101is5
相关产品推荐
相关产品推荐

