我有一个模块,我用 setuptools 打包成鸡蛋.我对相对/绝对 improts 有疑问。
目录结构如下:
setup.py # using setuptools
mymodule/
|- __init__.py
|- mymodule_core.py
|- utils.py
当我 easy_install mymodule 在来自 egg 的系统中,这个导入效果很好:
# 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__ = 但我不能让它工作
相关:
请您参考如下方法:
一个简单的方法是处理 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 语法以两种方式工作。
