Python 3.x 在Python3包中导入--有没有办法避免写;点“;?

Python 3.x 在Python3包中导入--有没有办法避免写;点“;?,python-3.x,package,Python 3.x,Package,假设我有一个包含内容的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 为了让

假设我有一个包含内容的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
为了让它工作,我需要添加点
from.text import text
,但是如果某些用户想要使用它,那么这当然不起作用,在
funniest/funniest
文件夹中,以旧的方式

>> from joke import joke
有没有一种方法可以使导入既可以作为本地导入,也可以在包内“工作”?(在Python2中,在两个用例中似乎都没有圆点)


或者是为了明确区分这些用例吗?

在最有趣的目录(与
text.py
的级别相同)中添加一个文件
\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
)。这将把这个目录变成一个(简单的)python包。 然后,您可以从funniest.text中编写
。导入文本
导入最有趣的笑话
。 在Python3中,所有导入都是绝对的,除非您至少在前面加上一个“.”来表示它是相对的。 这是为了避免Python2的不一致性,Python2将名称作为绝对值,如果它不将其作为相对值

您的示例通常是这样做的原因:
从文本导入文本

“fromtext”模棱两可:您是指当前目录中的“text.py”模块(相对)还是python运行库中的“text.py”模块(绝对)

在模块内部可以使用相对导入(带点),在模块外部可以使用绝对导入

如果希望脚本在python 2.7和python 3中具有相同的行为,请使用:
从未来导入绝对导入


这迫使Python2充当Python3进行导入,因此编写导入语句与这两个版本一致(前提是编写的模块能够与这两个版本一起使用)。

谢谢。但是如果我理解正确的话,“from joke import joke”仍然不起作用,如果有人没有安装软件包,是吗?(ModuleNotFoundError:没有名为'funniest'的模块)是。仅复制python文件对于您自己的使用非常有用,但是如果您希望其他人使用它,您应该以正确的方式安装它。使用setup.py,或者只需将最有趣的完整目录复制到
PYTHONPATH
环境变量指向的目录中。