Python 在包内导入,因为_init__u;.py是可选的
我正在构建一个包含要运行的脚本的包。它们直接导入脚本下的子文件夹中包含的模块。现在,正确的文件结构和Python 在包内导入,因为_init__u;.py是可选的,python,python-3.x,package,python-import,Python,Python 3.x,Package,Python Import,我正在构建一个包含要运行的脚本的包。它们直接导入脚本下的子文件夹中包含的模块。现在,正确的文件结构和import语句是什么?我不想指定从最上面的文件夹向下导入,只作为相对路径,在这里sub/module 这是文件结构的当前状态: Root\ src\ sub\ module.py script.py parent_module.py setup.py # Inside script.py import su
import
语句是什么?我不想指定从最上面的文件夹向下导入,只作为相对路径,在这里sub/module
这是文件结构的当前状态:
Root\
src\
sub\
module.py
script.py
parent_module.py
setup.py
# Inside script.py
import sub.module # Doesn't work
from sub import module # Doesn't work
import src.sub.module # Does work!
import .sub.module # Doesn't work
import .parent_module # Does work!
我想我需要一些\uuuu init\uuuu
文件,但那是什么,在哪里?非常感谢您的帮助,我对包装了解不多
此外,我当然愿意接受改变结构的建议,如果这能让事情变得更简单的话。缺少的
\uuuu init\uuuuuy.py
不是问题-您使用的是过时的相对导入
import sub.module # implicit relative import - py2 only
from . import sub.module # explicit relative import
请注意,
导入始终需要来自的。导入
表单。否则它将不会生成有效的名称。假设您通过python3-msrc.script运行script.py
,那么下面的代码应该可以运行,IDE可能也会这样做
from . import sub.module
from .sub import module
from .sub.module import *
from . import parent_module
如果您以普通的python3script.py
或python3-mscript
运行,则不能使用相对导入。在这种情况下,只有绝对进口才起作用
import sub.module
from sub import module
from sub.module import *
import parent_module
虽然您不需要\uuuu init\uuuu.py
文件,但如果您的包不是命名空间,则最好添加它们。否则,其他类似构造的同名包可能会插入到您的包中。您的Python版本是什么?(运行python-V
进行检查)@kristaps python 3.6.5,在3.3.x之后,请注意,没有\uuuuu init\uuuuuuuy.py
仍然会有所不同-它标记了一个名称空间包。对于常规软件包,您应该像以前一样继续添加\uuuu init\uuuu.py
。如何运行script.py?“我得到了完全不同的结果。”itsadok说,这是一个有价值的评论。在执行解释语言之前,不要依赖IDE错误。PyCharm给出了一个错误,程序执行得很好。非常感谢您的回答!看来绝对进口才是出路。现在我已经讨论这个问题一段时间了,我可以问一些直接的问题吗?这些问题可能不是这些论坛最好的风格?我希望你能取悦我。如果与setuptools一起安装并作为cmd脚本执行,这些绝对导入是否有效?如果没有,您将如何安装和执行需要自定义模块才能运行到不同环境的脚本?PyCharm的脚本执行已经有点不同了,所以我想确定一下。@Felix使用setuptools安装是可以的-您可以在任何情况下使用绝对导入。不过,我建议使用console_脚本入口点,因为它允许开发和部署的相对导入。请参阅和以供参考。