2

我有一个模块,我用setuptools打包成一个鸡蛋。我对相对/绝对的改进有疑问。

目录结构如下:

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

当我从 egg 在系统中进行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__ =我无法使其工作

有关的:

4

1 回答 1

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语法可以使用任何一种方式。

于 2013-05-27T16:27:03.883 回答