Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Python模块中正确使用相对或绝对导入?

如何在Python模块中正确使用相对或绝对导入?
EN

Stack Overflow用户
提问于 2010-09-01 10:11:39
回答 5查看 23.3K关注 0票数 26

在Python中使用相对导入有一个缺点,您将不能再将模块作为独立模块运行,因为您将得到一个异常:ValueError: Attempted relative import in non-package

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# /test.py: just a sample file importing foo module
import foo
...

# /foo/foo.py:
from . import bar
...
if __name__ == "__main__":
   pass

# /foo/bar.py: a submodule of foo, used by foo.py
from . import foo
...
if __name__ == "__main__":
   pass

我应该如何修改示例代码才能执行所有代码:test.pyfoo.pybar.py

我正在寻找一个与python 2.6+ (包括3.x)一起工作的解决方案。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-05 22:44:53

首先,我假设您知道您所编写的代码会导致循环导入问题,因为foo导入bar,反之亦然;尝试添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from foo import bar

添加到test.py,您将看到它失败了。必须更改该示例才能正常工作。

因此,您所要求的实际上是在相对导入失败时后退到绝对导入;实际上,如果您正在执行foo.py或bar.py作为主模块,其他模块将仅位于根级别,如果它们与系统上的另一个模块共享名称,则将根据sys.path中的顺序选择哪个模块。由于当前目录通常是第一个,如果可用,将选择本地模块-也就是说,如果您在当前工作目录中有一个'os.py‘文件,则将选择它而不是内置的文件。

一个可能的建议是:

foo.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    from . import bar
except ValueError:
    import bar

if __name__ == "__main__":
    pass

bar.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    pass

顺便说一句,从合适的位置调用脚本通常要好得多。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m foo.bar

可能是最好的方法。这个runs the module as a script

票数 16
EN

Stack Overflow用户

发布于 2010-09-01 12:23:36

你可以以一种不同的方式开始“作为独立的模块运行”:

而不是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python foo/bar.py

使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -mfoo.bar

当然,foo/__init__.py文件必须存在。

还请注意,你在foo.pybar.py之间有一个循环依赖--这是行不通的。我想这只是你例子中的一个错误。

更新:将它用作foo/bar.py的第一行似乎也很好用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python -mfoo.bar

然后,您可以直接在POSIX系统中执行该脚本。

票数 22
EN

Stack Overflow用户

发布于 2011-02-12 07:43:42

每个文件夹中都需要__init__.py

仅当执行以下操作时,相对导入才有效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python test.py

test.py导入foo.py和foo.py可以相对导入test.py及以上文件夹中的任何内容。

你不能这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd foo
python foo.py
python bar.py

它永远不会起作用。

您可以尝试使用sys.path.append或sys.path.insert解决方案,但是这样会弄乱路径,并且f=open(文件名)也会出现问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3616952

复制
相关文章
Python相对、绝对导入浅析
这篇文章从另外一个不同的视角来分析一下Python的import机制,主要的目的是为了搞懂import中absolute、relative import遇到的几个报错。  这里不同的视角是指从Python import hooks这个方面来展开,当然本身关于Python import hooks有很多的文章,我这里不打算展开聊这个方面的内容,文章中主要会结合代码和PEP 302 – New Import Hooks这个PEP。  1. 几个跟import相关模块属性 首先我们需要了解几个跟import相关
庞小明
2018/03/09
1.2K0
Python的绝对导入和相对导入
Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。
狼啸风云
2019/11/27
4.5K0
【Python】对绝对导入与相对导入的理解的补充
在前一篇文章对相对导入的“相对”其实已经讲得比较清楚了,关键的一点是,“相对”是相对package的意思。相对导入的常用语法:
明月AI
2021/10/28
1.3K0
【Python】对绝对导入与相对导入的理解的补充
python包相对导入
注意此时mobike成为一个python包。 在loc.py中导入utils.py该怎么办?
py3study
2020/01/02
2.1K0
【Python模块】- 如何导入和使用模块?模块导入方式有哪些?
首先先准备两个模块,md_01_测试模块1和 md_02_测试模块2,然后在demo文件中导入模块并使用工具。
python自学网
2022/10/05
3.3K0
【Python模块】- 如何导入和使用模块?模块导入方式有哪些?
css中绝对定位_绝对定位和相对定位怎么用
bottom属性描述时,以首屏页面左下角为参考点 如果浏览器不动,滚动条动的时候,红色盒子跟随页面动,红绿盒子间距不变。
全栈程序员站长
2022/11/17
2.6K0
css中绝对定位_绝对定位和相对定位怎么用
Python 导入模块中的类
在看代码时发现Python的导入类也可以用“.”的方式,很是惊奇,记录下来: 如以下代码:其所在文件(模块)为test.py
用户7886150
2020/12/24
2.3K0
【Python】模块导入 ① ( Python 模块简介 | 模块概念 | 模块作用 | 模块特点 | 常见的 Python 模块 | Python 模块导入 | Python 模块导入语法 )
Python 模块 就是一个以 .py 为后缀的 Python 代码文件 , 在模块中定义有 :
韩曙亮
2023/10/11
2610
Python中的循环(或循环)导入
本文翻译自:Circular (or cyclic) imports in Python
用户7886150
2020/11/30
3.5K0
【Python】模块导入 ② ( 模块导入语法 | 导入完整模块 | import 导入完整模块 | from 导入完整模块 )
该方法用于 导入完整的模块 , 包括模块中的 函数 / 变量 / 类 / 代码块 等 ;
韩曙亮
2023/10/11
2490
【Python】模块导入 ② ( 模块导入语法 | 导入完整模块 | import 导入完整模块 | from 导入完整模块 )
python模块导入
[seemmo@RegionServer1 duwen]$ python Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
py3study
2020/01/14
1.5K0
CSS:绝对单位、相对单位
我们对单位很熟悉,比如说,千克,千米,米等,这些就是绝对单位,我们又有听到太阳的质量等于33个地球,这个就是相对单位。在CSS中,单位也可以分为这两类。
Jean
2021/10/23
2.1K0
CSS:绝对单位、相对单位
Python 导入模块
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 导入模块 更多内容请见👇 Python 入门基础专栏 Python 字符串 Python 常用字符串方法 ---- Python 导入模块 1.import 模块名 2.import 模块名 as 名称缩写 3.import 模块名.子模块名 as 名称缩写 4.from 模块名 import 函
小嗷犬
2022/11/15
1.3K0
python中关于模块导入的模式
举例:只想导入time模块中的ctime、time两个方法,可以按照以下的格式导入:
Java学术趴
2022/07/15
1.6K0
python中关于模块导入的模式
python 模块、time、datetime 导入使用(4.0)
将时间对象转换为list, 对相应的时间重新赋值后, 通过time.struct_time生成一个新的时间对象
友儿
2022/09/28
6850
Pycharm中无法导入(import)自己写的模块或脚本
问题描述:我在code文件夹下编写了translate.py 和 test.py两个脚本文件。想在test.py中import translate.py的一个函数,发现却不行。 image.png 解
Aidol
2020/07/23
3.7K0
Pycharm中无法导入(import)自己写的模块或脚本
模块引用方式利弊辨析: 全局绝对引用(alias) && 长相对引用
你一定知道,webpack中有个叫做alias的配置属性,可以帮助我们搞全局引用配置。比如说,在webpack.config.js中配置相应的键值对,我们就可以通过require(‘util’) 这种方式,而非require(‘../../../util’)这种方式,去做引用。
啦啦啦321
2020/06/19
7470
【Python】模块导入 ③ ( 模块导入语法 | from 导入部分模块功能 | 为导入的模块设置别名 | import 导入模块设置别名 | from 导入模块设置别名 )
在导入模块时 , 有时不需要使用模块的完整功能 , 只需要导入指定的部分功能即可 , 这样也符合最少知识设计原则 ;
韩曙亮
2023/10/11
3100
【Python】模块导入 ③ ( 模块导入语法 | from 导入部分模块功能 | 为导入的模块设置别名 | import 导入模块设置别名 | from 导入模块设置别名 )
python 模块导入问题
在python中,模块导入和编码都是比较重要的,这两种东西一定要花时间弄清楚,如果摸棱两可,每次出问题都靠猜,那是非常痛苦的。
叶子陪你玩
2022/05/22
1.7K0
python 模块导入问题
1 - 导入python 模块
1. 导入python 模块的基本方式 2. 为导入的python 模块指定别名 import math from math import cos, tan from math import * print(math.sin(1.23)) print(cos(2.34)) print(tanh(1.23)) # 指定别名 as # 一旦指定了别名,原来的名字就不能用了 import math as mt print(mt.sin(2)) from math import cos as cs print
ruochen
2021/05/22
1.3K0
1 - 导入python 模块

相似问题

Python模块的绝对和相对导入: matplotlib示例

13

Python模块的绝对与显式相对导入

31

理解模块&绝对/相对包导入

10

Python相对/绝对导入(再次)

14

Python unittest扩展模块相对导入“正确”处理

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文