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
对于这一个,我相信有一些方法可以使用点语法relativeimport
,但同样,我希望保持所有路径的绝对性。毕竟,我相信根据python文档的介绍,我应该能够做到:
当包被构造成子包时(与示例中的声音包一样),可以使用绝对导入来引用同级包的子模块。例如,如果模块sound.filters.vocoder
需要使用sound.effects包中的echo模块
,它可以使用fromsound.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)