Skip to main content
 首页 » 编程设计

Python 蛋和相对导入

2025年05月04日998°冷暖

我有一个模块,我用 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 语法以两种方式工作。