如果我将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实现。
答案 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:])