【问题标题】:python load module from built-inpython从内置加载模块
【发布时间】:2013-09-07 02:48:07
【问题描述】:

我正在使用 python 3,我有一个名为 "http" (mypackage.http) 的模块,我还有另一个名为 foo 的模块,我想加载内置的 http module(不是我的 mypackage.http 模块)

我可以使用

imp.find_module('http', sys.path[1:])

获取内置的__ init__.py importlib path

例子:

/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/__ init__.py

但不推荐使用 imp.find_module()/load_module()。

如何通过importlib 等其他方式导入这个内置的http module?

项目示例:

  • 我的包裹
    • _init _.py
    • http.py(有相关的http类等)
    • foo.py(需要使用内置的http而不是mypackage.http)

谢谢!

【问题讨论】:

  • 你能举一个有问题的代码/包布局的例子吗?使用绝对导入(如在 Python 3 中),除非您尝试直接执行包中的文件,否则不会出现此问题。
  • 为什么我不能为我的模块命名?
  • 为什么python不使用内置的包导入方式?像 import builtin.sys 一样,我将能够根据需要命名我的模块,import mypackage.sys,或 import .sys (relative),import sys(relative) 等
  • 你可以,但你需要让它更像命名空间......但一般来说,你希望独特的模块名称作为良好 python 设计的一部分。
  • @fj123x: 当你得到这个错误时你在做什么?您是否将文件 foo.py 作为脚本运行?

标签: python dynamic module built-in


【解决方案1】:

随便用

import http

在 Python 2 中,如果 foo 在 mypackage 中,这将不起作用,但相对导入需要在 Python 3 中显式。

如果您将模块作为脚本运行,则需要以某种方式修复路径。如果使用正常的导入机制可以找到mypackage,那么您可以使用-m 开关运行模块:

python -m mypackage.foo

否则,您可能需要检查路径并手动更改它,以及设置 __package__ 以便相对导入正常工作。

【讨论】:

  • 那么他将如何导入同一文件夹中的相对http? (我没有太多 py3 经验)
  • @JoranBeasley:他应该使用from . import http。
  • 在这种情况下不错的 +1,我的整个答案都没用
  • 我想导入一个内置模块,而不是相对的 mypackage 模块(我的模块命名与一个内置模块相同)
  • @fj123x:这样做。
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 2017-01-01
  • 2011-08-27
  • 2012-12-18
  • 2018-03-09
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多