【发布时间】:2011-09-17 15:24:59
【问题描述】:
假设我有一个模块foo.py 和一个包foo/。如果我打电话
import foo
将加载哪一个?如何指定我要加载模块或包?
【问题讨论】:
-
pythons 导入系统是一个彻头彻尾的讽刺。
标签: python import module package
假设我有一个模块foo.py 和一个包foo/。如果我打电话
import foo
将加载哪一个?如何指定我要加载模块或包?
【问题讨论】:
标签: python import module package
我相信包总是会被加载。据我所知,你无法解决这个问题。因此,请更改包或模块名称。文档:http://docs.python.org/tutorial/modules.html#the-module-search-path
【讨论】:
实际上,可以通过手动引导导入机制使用.py 文件而不是目录。 (这段代码没有经过很好的测试,但似乎可以工作)。 2020 年更新:请注意,这需要使用自定义 import_module() 函数而不是普通的 import 语句。但是,对于现代 Python3 及其importlib,可能也可以使裸露的import 语句也以相同的方式工作。 (请注意,此答案显示了 Python 提供的灵活性。不鼓励在您的应用程序中使用它。仅当您知道自己在做什么时才使用它。)
文件foo.py
print "foo module loaded"
文件foo/__init__.py
print "foo package loaded"
文件test1.py
import foo
文件test2.py
import os, imp
def import_module(dir, name):
""" load a module (not a package) with a given name
from the specified directory
"""
for description in imp.get_suffixes():
(suffix, mode, type) = description
if not suffix.startswith('.py'): continue
abs_path = os.path.join(dir, name + suffix)
if not os.path.exists(abs_path): continue
fh = open(abs_path)
return imp.load_module(name, fh, abs_path, (description))
import_module('.', 'foo')
跑步
$ python test1.py
foo package loaded
$ python test2.py
foo module loaded
【讨论】:
importlib import hooks),可以使裸import foo 优先使用foo.py 模块而不是foo/包。
也许您想将您的课程从foo.py 模块移动到__init__.py。
这样您就可以从包中导入它们以及导入可选的子包:
文件foo/__init__.py:
class Bar(object):
...
文件foo/subfoo.py:
class SubBar(object):
...
文件mymodule.py:
from foo import Bar
from foo.subfoo import SubBar
【讨论】: