Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在包内导入,因为_init__u;.py是可选的_Python_Python 3.x_Package_Python Import - Fatal编程技术网

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_脚本入口点,因为它允许开发和部署的相对导入。请参阅和以供参考。