Python鸡蛋和相对导入

时间:2013-05-27 15:53:54

标签: python

我有一个模块,我打包为setuptools的鸡蛋。我有相对/绝对的印记问题。

目录结构如下:

setup.py        # using setuptools
mymodule/
 |- __init__.py
 |- mymodule_core.py
 |- utils.py

当我在系统中easy_install mymodule时,此导入效果很好:

# mymodule_core.py
from mymodule.utils import some_functions

但我也希望从命令行运行mymodule_core.py,而不安装它(用于简短的测试等)。在这种情况下,先前的导入将失败,这有效:

# mymodule_core.py
from utils import some_functions

如何处理import以便它在两种情况下都有效?

我想正确的解决方案包括if __name__ == "__main__"from .. import something__package__ =,但我无法使其正常工作

相关:

1 个答案:

答案 0 :(得分:1)

一种简单的方法是处理ImportError,就像这样......

# mymodule_core.py
try:
    from mymodule.utils import some_functions
except ImportError:
    from utils import some_functions

...在你的情况下可以正常工作。

如果你的包结构是“相对”导入不起作用的情况,我倾向于把这样的东西放在源文件的顶部......

import sys
import os

PACKAGE_PARENT = '..'
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))))
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT)))

...然后from packagename.modulename import symbols语法以任何一种方式工作。