我有一个模块,我打包为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__ =
,但我无法使其正常工作
相关:
答案 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
语法以任何一种方式工作。