我的文件夹结构如下
./fff
├── __init__.py
├── fg
│ ├── __init__.py
│ └── settings
│ ├── __init__.py
│ └── settings.py
└── obng
└── test.py
我想将fg/settings中的settings.py作为一个模块导入test.py
我加了一行
从..fg.settings导入设置
但是当我运行它时,它会给我以下错误
回溯(最近一次呼叫最后一次): 文件“/mnt/d/Repos/fff/obng/test.py”,第1行,在 从..fg.settings导入设置 ImportError:尝试在没有已知父包的情况下进行相对导入
根据https://docs.python.org/3/reference/import.html#package-relative-imports支持这种类型的相对导入
我做错了什么
相对导入基于当前模块的名称。跑步时
test.py的名称将为
__main__
,导入将不起作用有效的方法是在导入fff.obng.test的fff模块外部使用另一个名为“test.py”的脚本
使用fff_top/test.py:
然后,运行“external”test.py应该可以:
或者,我建议完全放弃相对进口。一种方法是为您编写的每个包使用虚拟环境,例如使用venv库:
然后,在根文件夹中添加setup.py,内容如下:
并更改
obng/test.py
中的导入:最后,激活您的虚拟环境:
并以可编辑模式安装软件包:
然后,在完成上述所有步骤后:
应该有用
通常,当您将python模块作为
python filename.py
这样的主模块运行时,您不能使用相对导入,但是有一种使用__package__
来实现这一点的方法。请记住__package__
是python解析相对导入的方式:1-在根目录中创建一个名为
__init__.py
的文件-fff
。(我可以看到你有它,我提到的完整性)2-将此代码放在
test.py
模块的顶部:注意:
sys.path
是python搜索模块以导入模块的地方3-现在将相对导入语句放在上面的代码之后(在if语句中,因为我们不想在导入
test.py
时弄乱):现在您可以调用
test.py
,它将毫无问题地运行。我不建议使用这些技巧,但在某些情况下,展示语言的灵活性和做你想做的事情是有益的其他好的解决方案:我认为绝对进口比这更容易、更干净。另外,看看@Mr_and_Mrs_D的答案,另一个好的解决方案是使用^{} 命令行标志运行模块
这是一个如何运行项目的问题——应该从顶级包的父目录运行,如中所示
然后将正确解析相对导入。它是直接从其文件夹运行脚本的反模式
相关问题 更多 >
编程相关推荐