Python 2.5 中的相对导入

2023-12-19

我知道在 Python 中存在很多关于相同导入问题的问题,但似乎没有人能够提供正确用法的清晰示例。

假设我们有一个包mypackage有两个模块foo and bar。里面foo我们需要能够访问bar.

因为我们还在开发中,mypackage不在sys.path.

我们希望能够:

  • import mypackage.foo
  • run foo.py作为脚本并执行示例用法或测试__main__部分。
  • 使用Python 2.5

我们必须如何在 foo.py 中进行导入才能确保它在所有这些情况下都能工作。

# mypackage/__init__.py
...

# mypackage/foo/__init__.py
...

# mypackage/bar.py
def doBar()
    print("doBar")

# mypackage/foo/foo.py
import bar # Fails with module not found
import .bar # Fails due to ValueError: Attempted relative import in non-package

def doFoo():
    print(doBar())

if __name__ == '__main__':
    doFoo()

看看下面的信息来自PEP 328 http://www.python.org/dev/peps/pep-0328/#relative-imports-and-name:

相对导入使用模块的__name__属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为'__main__')然后相对导入将被解析,就像该模块是顶级模块一样,无论该模块实际位于文件系统上的位置。

当你跑步时foo.py作为脚本,该模块的__name__ is '__main__',所以你不能进行相对导入。即使mypackage was on sys.path。基本上,如果导入了某个模块,则只能从该模块进行相对导入。

以下是解决此问题的几个选项:

1) In foo.py,检查是否__name__ == '__main__'并有条件地添加mypackage to sys.path:

if __name__ == '__main__':
    import os, sys
    # get an absolute path to the directory that contains mypackage
    foo_dir = os.path.dirname(os.path.join(os.getcwd(), __file__))
    sys.path.append(os.path.normpath(os.path.join(foo_dir, '..', '..')))
    from mypackage import bar
else:
    from .. import bar

2)始终导入bar using from mypackage import bar,并执行foo.py以这样的方式mypackage自动可见:

$ cd <path containing mypackage>
$ python -m mypackage.foo.foo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 2.5 中的相对导入 的相关文章

  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • R:简单乘法导致整数溢出

    在较长的脚本中 我必须将向量 A 的长度 2614 乘以数据帧 B 的行数 1456000 如果我直接这样做length A nrow B 我收到消息NAs produced by integer overflow尽管当我乘以相同的数字时没
  • 如何在spark中读取orc事务hive表?

    如何在spark中读取orc事务hive表 我在通过 Spark 读取 ORC 事务表时遇到问题 我获得了配置单元表的架构 但无法读取实际数据 查看完整场景 hive gt create table default Hello id int
  • Selenium 验证 div 有滚动条

    我正在尝试验证特定的 div 有滚动条 如何使用 Selenium 来做到这一点 元素 div class checkout mini cart Code JavascriptExecutor jsExecutor JavascriptEx
  • 当自动递增列用完时会发生什么?

    考虑一个带有自动增量列的简单表 如下所示 CREATE TABLE foo fooid bigint unsigned NOT NULL auto increment snipped other columns PRIMARY KEY fo
  • 除了静态库本身之外,停止 cmake target_link_libraries 链接静态库的两个目标文件

    我尝试使用 cmake ninja msvc 在 Windows 上构建一个相当大的共享库 它由子文件夹中的多个静态库组成 那么一个根CMakeLists txt好像 project sharedlib CXX include CMAKE
  • 如何检查计费协议是否有效或取消?

    我在 PayPal 中使用参考交易 API 不确定计费时计费协议是否有效 我想提前了解计费协议是否被取消 我想知道计费协议取消电话的回拨电话 要检查计费协议的状态 您可以使用 BAUpdate API NVP METHOD BillAgre
  • R 中 N 个元素与 q 个元素的组合

    I have N 6元素和q 3元素符号为0 1 2 我想创建的所有向量N 6元素与2元素等于0 2元素等于1 and 2元素等于2在所有可能的位置 这些向量的数量等于combn 6 2 combn 4 2 combn 2 2 90 这是构
  • qt中的“morph into”有什么用?

    在qt gui编辑器中 任何gui组件都可以变形为某种类型的其他gui组件 但实际上 这个选项的实际用途是什么 可以动态完成吗 如果是的话那么这样做的好处是什么 实际用途是快速将小部件转换为其他类似的小部件 假设您有一个包含一些小部件的组框
  • Azure 无效 AccessToken

    我正在尝试使用 Microsoft Azure Management Resources 库来管理一些 Azure 资源 我已在 Azure AD 中注册了应用程序 并授予了它所有权限 我获取了它的 ApplicationId 和 Secr
  • 链接器文件中输入和输出部分之间的区别?

    虽然在生成的二进制或 ELF 文件的上下文中可以清楚什么是节 但文档中的许多地方 与所使用的编译器无关 将它们称为输入或输出节 它们之间有什么区别 链接器使用目标文件 以及可能的共享库 并输出 可执行文件或共享库 输入目标文件由命名的 部分
  • 在 Python 2.4 中处理上下文类

    我正在尝试使用 python daemon 模块 它提供 daemon DaemonContext 类来正确地守护脚本 虽然我主要针对 Python 2 6 但我想保持对版本 2 4 的向后兼容性 Python 2 5 支持从以下位置导入上
  • 创建一个接受对象但不接受数组的通用函数

    我想创建一个满足以下条件的通用 TypeScript 函数 f a 1 success f undefined success f should fail the type check f 1 2 should fail the type
  • ImageMagick PATH 无法被knitr 中的engine = "tikz" 识别

    我正在尝试编译 TikZ 图形knitr 我正在使用可用的示例here https github com yihui knitr examples blob master 058 engine tikz Rmd 我专门尝试从 Rstudio
  • 如何防止任务管理器杀死我的程序?

    有什么方法可以保护我的 Delphi 应用程序不被 Windows 任务管理器 或其他类似 Process Explorer 杀死 我认为 Windows 消息可以做到这一点 通过执行挂钩并拦截 TerminateProcess 消息 我想
  • 根据年份而不是最小值或最大值重置序列

    创建一个将根据年份重置的序列 考虑以 000000001 开头的 9 位数字序列 最大值为 999999999 出租日期为 30 12 2017 seq 为 000012849 因此 当日期为 01 01 2018 时 我希望 seq 为
  • WebSocket 在 django 通用中间件中生成错误

    我正在使用 Django gevent socketio Haproxy 所有套接字功能都工作正常 但在后台它会生成如下所示的错误 似乎 Haproxy 的套接字标头具有非常有限的属性 其中不包含 status code 因此它失败并发送错
  • 如何存储每个上下文而不是每个程序的 OpenGL 程序对象的制服?

    我正在开发多线程 OpenGL 合成引擎 我有一组在多个上下文之间共享的着色器 出于性能原因 我想避免为每个线程编译每个着色器程序的单独实例 但是 如果多个线程碰巧使用同一个程序对象 并且我尝试在每个线程上设置不同的统一值 则统一值会混淆
  • 导入/导出项目首选项

    遇到一点问题 由于我们使用的源代码控制设置 每个错误 增强都在新分支中进行 这很好 但是在 Eclipse 中 我们需要为每个分支设置一个新项目 有没有什么方法可以轻松地为项目设置默认首选项 或者在 Eclipse 中导入 导出项目首选项
  • 使用Maven和Spring实现依赖倒置原则

    根据这篇维基百科文章 实现依赖倒置原则 https en wikipedia org wiki Dependency inversion principle DIP implementations可以通过两种方式完成 在单独的包中对低级组件
  • Python 2.5 中的相对导入

    我知道在 Python 中存在很多关于相同导入问题的问题 但似乎没有人能够提供正确用法的清晰示例 假设我们有一个包mypackage有两个模块foo and bar 里面foo我们需要能够访问bar 因为我们还在开发中 mypackage不