如果模块'example'包含函数'run'和子模块'run',我可以依靠'from example import run'来始终导入前者吗?

时间:2012-01-16 13:28:03

标签: python

如果我将Python模块实现为具有顶级函数run和子模块run的目录(即包),我可以指望from example import run始终导入功能?基于我的测试,至少在Linux上使用Python 2.6和Jython 2.5,但我能否依靠这一点?我试图搜索有关导入优先级的信息但找不到任何内容。

背景:

我有一个非常大的包,人们通常从命令行作为工具运行,但有时也会以编程方式使用。我希望两种用法都有简单的入口点,并考虑像这样实现它们:

example/__init__.py

def run(*args):
    print args  # real application code belongs here

example/run.py

import sys
from example import run
run(*sys.argv[1:])

第一个入口点允许用户从Python访问模块,如下所示:

from example import run
run(args)

后一个入口点允许用户使用以下两种方法从命令行执行模块:

python -m example.run args
python path/to/example/run.py args

这两者都很有效,涵盖了我需要的一切。在将其用于实际使用之前,我想知道这是一种合理的方法,我可以期望在所有操作系统上使用所有Python实现。

1 个答案:

答案 0 :(得分:2)

我认为这应该始终有效;函数定义将遮蔽模块。

然而,这也是一个肮脏的黑客攻击我。干净的方法是

# __init__.py
# re-export run.run as run
from .run import run

,即最小__init__.py,包含run.py中所有正在运行的逻辑:

# run.py
def run(*args):
    print args  # real application code belongs here

if __name__ == "__main__":
    run(*sys.argv[1:])