python某个module使用了相对引用,同时其__name__又是__main__导致的错误
主要讲解 某个module中使用了相对引用,同时这个module的 __name__ 属性 又是 __main__ 会报错的问题
1、问题复现
文件结构很简单:
|--------package
| ├── __init__.py
| ├── base.py
| └── derived.py
|--------main.py
各个文件内容如下:
#base.py
def testfun():
print('base')
#derived.py
from .base import testfun
testfun()
然后 cd到 derived.py 所在目录,执行 python derived.py
报错:
ModuleNotFoundError: No module named '__main__.base'; '__main__' is not a package
2、问题原因-----使用了相对引用的module的__name__ 属性是 __main__ 的时候,会导致错误
这里使用了相对引用:主要是对于使用了相对引用的python文件,会利用 这个文件的 __name__ 属性 定位相对引用的package。
如果 那个python文件 是 __main__(也就是说不包含任何package信息) ,那么相对引用会被解析成 top level module,而不关注 这个 module 是否存在于文件系统中
此外 如果直接执行 python 文件名.py 的时候,这个文件名.py 对应的module __name__ 值就是 '__main__'
3、解决办法
包含相对引用的 module,不要直接利用 解释器执行,也就是说这个module的 __name__ 属性不要作为 __main__, 可以 加入一个 main.py 文件,作为入口,同时这个main.py 文件不包含相对引用
4、引申一点 关于相对引用的集中情况
################import可以引入一个 module,可以引入一个函数
# Import 同一個 package 底下的 sibling module `moduleY`
[A] from package.subpackage1 import moduleY
[R] from . import moduleY
[Error] import .moduleY
# 從同一個 package 底下的 sibling module `moduleY` 中的函数 spam
[A] from package.subpackage1.moduleY import spam
[R] from .moduleY import spam
# 從隔壁 package 底下的 module `moduleZ`中的函数 eggs
[A] from package.subpackage2.moduleZ import eggs
[R] from ..subpackage2.moduleZ import eggs
# Import parent package 底下的 module `moduleA`
[A] from package import moduleA
[R] from .. import moduleA 或 from ... package import moduleA
5、参考文献:
https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3
python某个module使用了相对引用,同时其__name__又是__main__导致的错误的更多相关文章
- python模块module package
python模块module package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...
- Python中module文件夹里__init__.py的功能
怎么引用模块 环境:win7 + python3.5.2文档结构: -project -data -src -filterCorpus.py -translateMonolingual.py 问题 ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python调用shell, shell 引用python
python 调用 shell get_line_num="wc -l as_uniq_info | awk '{print $1}'" ###get the lines of & ...
- python no module named _socket 原因
python no module named _socket 原因 Lib/site-packages 不在 sys.path 中
- Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因
Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因 原因之1: 例如有这样的一个包和它的模块: Test __init__.py Mod ...
- 问题1-/usr/bin/python: No module named virtualenvwrapper
操作系统:Ubuntu 问题:创建虚拟环境时,出现:/usr/bin/python: No module named virtualenvwrapper 解决方法: 1.切换到用户家目录 2.打开隐藏 ...
- 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...
- python学习笔记011——内置函数__module__、__name__
1 __module__描述 __module__ : 如果当前模块为顶层模块执行 则打印__main__ 如果当前模块为被调用模块的时候 打印当前模块的名称 2 __module__示例 def f ...
随机推荐
- 【学习笔记】pytorch中squeeze()和unsqueeze()函数介绍
squeeze用来减少维度, unsqueeze用来增加维度 具体可见下方博客. pytorch中squeeze和unsqueeze
- React 之 组件生命周期
React 之 组件生命周期 理解1) 组件对象从创建到死亡它会经历特定的生命周期阶段2) React组件对象包含一系列的勾子函数(生命周期回调函数), 在生命周期特定时刻回调3) 我们在定义组件时, ...
- springboot-4-CRUD开发实战
流程: 创建项目,勾选基本的几个开发工具还有webstarter 再创建包(service,control,config,dao,pojo) 再前往https://www.webjars.org/,选 ...
- centos7下安装、配置Nginx、设置Nginx开机自启动
测试环境: [root@centos-linux ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core) [root@cento ...
- odoo里面条件写法
attrs="{'invisible': ['|', ('probability', '>', 0), ('active', '=', True)]}"/>. 写法gt ...
- java垃圾回收机制学习总结
最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...
- PHP 接受提交变量过滤类
Filter.class.php : 1 <?php 2 class Filter{ 3 4 /** 5 * 将\n转化为<br/> 6 * 7 * @param stri ...
- 记一次WindowsServer2012提权 - 烂土豆
此次主题:烂土豆 shell咋拿的 我也忘了 好像是添加友情链接那里还是啥 不重要了 直接获取shell后 先用systeminfo > 1.txt了一下 然后放到了 windows-explo ...
- Python3中的字符串相关操作
Python3的字符串操作相关函数详解 字符串内建函数 1. capitalize() 将字符串中的第一个字符转换成大写,其他字母变成小写.例: >>> "hello Wo ...
- 跟我一起写 Makefile(十二)
隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...