Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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:导入语句中无法识别父包的名称_Python_Python 3.x_Import_Package_Python Import - Fatal编程技术网

Python:导入语句中无法识别父包的名称

Python:导入语句中无法识别父包的名称,python,python-3.x,import,package,python-import,Python,Python 3.x,Import,Package,Python Import,我知道在这个话题上有很多问题,但我看到的大多数答案都描述了复杂的解决问题的方法,在我看来,这些方法应该很简单。以下是我的目录结构: Mapper/ LICENSE.txt README.txt setup.py bin/ # nothing here, yet mapper/ __init__.py process.py where.py # ... binco

我知道在这个话题上有很多问题,但我看到的大多数答案都描述了复杂的解决问题的方法,在我看来,这些方法应该很简单。以下是我的目录结构:

Mapper/
    LICENSE.txt
    README.txt
    setup.py
    bin/
        # nothing here, yet
    mapper/
        __init__.py
        process.py
        where.py
        # ...
        binconvert/
            __init__.py
            tocsv.py
            todict.py
            # ...
我想在我所有本地开发的模块上使用绝对路径,以减少混乱并避免提到的bug

然而,我对此有很多问题。当我运行
process.py
时,其中我
import
tocsv.py
如下所示

from mapper.binconvert import tocsv
我得到错误:
ModuleNotFoundError:没有名为“mapper”的模块

我知道我可以从binconvert import tocsv中执行
,但正如我所说的,我正在尝试让所有本地开发的模块导入使用绝对路径

当我尝试导入
where.py
时,我在
tocsv.py
中遇到与以前相同的错误,如下所示:

 from mapper import where
对于这一个,我相信有一些方法可以使用点语法relative
import
,但同样,我希望保持所有路径的绝对性。毕竟,我相信根据python文档的介绍,我应该能够做到:

当包被构造成子包时(与示例中的声音包一样),可以使用绝对导入来引用同级包的子模块。例如,如果模块
sound.filters.vocoder
需要使用
sound.effects包中的echo模块
,它可以使用from
sound.effects import echo


执行
process.py
时,您已经位于mapper包中。Python将查看在
sys.path
中定义的所有路径,以查找模块,在本例中,模块仅由
[“标准Python路径”、“映射器/映射器”]
组成

在这种情况下,python在这些目录中找不到名为mapper的模块(您已经在mapper模块中了)

为您提供的解决方案:


  • 使用符号:
    from.binconvert import tocsv
    (符合)
  • 在启动前从1目录向上移动,并从
    Mapper
    目录启动
    process.py
  • 在启动
    process.py
    之前,通过添加
    Mapper
    路径来更改PYTHONPATH环境变量

  • 如果包含“mapper”包的目录的位置在sys.path中,则可以从“mapper”包的任何位置导入being(使用“from mapper.anythis import”)

    # in process.py
    import os, sys
    THIS_DIR = os.path.dirname(os.path.abspath(__file__)) #  "mapper" dir
    MAPPER_ROOT_DIR = os.path.dirname(THIS_DIR) #  points to "Mapper" dir
    if MAPPER_ROOT_DIR not in sys.path:
        sys.path.insert(0, MAPPER_ROOT_DIR)
    

    您可以在出现问题的每个模块中包含此代码段。约定是在正在运行的第一个模块中设置路径(在导入任何“自己的”包之前)。sys.path内容在所有已运行模块之间共享。

    如果您在
    process.py
    内部,则
    mapper
    包未知,您必须在
    mapper
    目录之外才能导入它。不能将
    process.py
    作为脚本执行,只有在执行Python脚本的当前工作目录中可以访问
    mapper
    时,才能从mapper.binconvert导入tocsv
    中执行
    。在
    setup.py
    旁边,尝试
    import mapper.process
    ,您将看到它应该可以工作。
    from.binconvert import tocsv
    mapper
    process.py
    的parrent目录,不在包含
    process.py的目录中。py
    他是否应该将“mapper”目录添加到pythonpath以便“导入mapper”?@philippd是的,当然,谢谢,我纠正了我的错误;)谢谢你的建议。关于选项二,如果我将
    process.py
    放在
    Mapper
    bin
    子目录中,它会起作用吗?我想,因为它是“主脚本”,所以它可能属于那里。@VictorOdouard如果您在
    bin
    目录中移动
    process.py
    ,您仍然需要更改pythonpath,以告诉python在
    mapper
    目录中查找映射器模块好的,谢谢Cédric。因此,澄清一下,决定sys.path中的内容的不是模块本身所在的位置,而是脚本从何处执行?我认为这不是解决问题的正确方法。除非您这样做是为了快速测试,但是“您可以在出现问题的每个模块中包含此代码段”,否则“Cando”并不意味着“必须”。
    # in process.py
    import os, sys
    THIS_DIR = os.path.dirname(os.path.abspath(__file__)) #  "mapper" dir
    MAPPER_ROOT_DIR = os.path.dirname(THIS_DIR) #  points to "Mapper" dir
    if MAPPER_ROOT_DIR not in sys.path:
        sys.path.insert(0, MAPPER_ROOT_DIR)