假设我有一个包含内容的text.py文件
text = u'Wenn ist das Nunst\u00fcck git und Slotermeyer?'
和带有内容的文件joke.py
from text import text
def joke(): return text
可以导入到同一目录中的另一个python脚本。我想将其转换为包并创建结构
/funniest
setup.py
/funniest
joke.py
text.py
要使其正常工作,我需要添加 dot from .text import text
,但是如果某些用户想要在funniest/funniest
中使用它,那么这当然是行不通的文件夹,以旧方式
>> from joke import joke
是否有一种方法可以使导入既可以作为本地导入也可以在软件包中“使用”? (在Python2中,似乎在两个用例中都没有圆点就可以了)。
还是故意在这些用例之间做出明确区分?
答案 0 :(得分:1)
在最有趣的目录(与__init__.py
相同的目录)中添加文件text.py
。这会将这个目录变成一个(简单的)python包。
然后,您可以写from funniest.text import text
或
import funniest.joke
。
在python 3中,所有导入都是绝对的,除非您至少加一个“”。表示相对。
这是为了避免python 2的不一致,如果它没有发现它是相对的,它将名称命名为绝对。
您的示例通常是这样做的原因:
from text import text
“来自文本”是模棱两可的:您是指当前目录中的“ text.py”模块(相对)还是python运行时库的“ text.py”模块(绝对)。
在模块内部,可以使用相对导入(带点),在模块外部,可以使用绝对导入。
如果您希望脚本在python 2.7和python 3中具有相同的行为,请使用:
from __future__ import absolute_import
这会强制python 2充当python 3的导入,因此编写import语句与两个版本都一致(前提是您编写的模块可同时用于两个版本)。