如何根据相对路径导入Python模块?
例如,如果dirFoo包含Foo.py和dirBar,和dirBar包含Bar.py,我怎么导入Bar.py到Foo.py?
这是一个直观的表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Run Code Online (Sandbox Code Playgroud)
Foo希望包括Bar,但重组文件夹层次结构不是一种选择.
想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
我正在编码mod1,我需要从中导入一些东西mod2.我该怎么办?
我尝试了from ..sub2 import mod2但是我得到了"尝试非包装中的相对导入".
我google了一下,但发现只有" sys.path操纵"黑客.有没有干净的方式?
编辑:我__init__.py的所有人目前都是空的
EDIT2:我想这样做,因为SUB2包含了为子包(共享类sub1,subX等等).
Edit3:我正在寻找的行为与PEP 366中描述的相同(感谢John B)
我想知道在Python应用程序中导入包的首选方法.我有这样的包结构:
project.app1.models
project.app1.views
project.app2.models
Run Code Online (Sandbox Code Playgroud)
project.app1.views进口project.app1.models和project.app2.models.有两种方法可以实现这一点.
绝对进口:
import A.A
import A.B.B
Run Code Online (Sandbox Code Playgroud)
或者使用PEP 328在Python 2.5中引入的显式相对导入:
# explicit relative
from .. import A
from . import B
Run Code Online (Sandbox Code Playgroud)
什么是最pythonic的方式来做到这一点?
我们from module import function称之为FMIF编码风格.
我们import module称之为IM编码风格.
我们from package import module称之为FPIM编码风格.
为什么IM + FPIM被认为是比FMIF更好的编码风格?(请参阅此帖子以获取此问题的灵感.)
以下是一些让我更喜欢FMIF而非IM的标准:
chisquare(...)看起来比可读性更强 scipy.stats.stats.chisquare(...).虽然这是一个主观标准,但我认为大多数人会同意.
function从alt_module不是module我需要改变只有一条线路:from alt_module import function.如果我使用IM,我需要更改许多行代码.
我对IM + FPIM可能比FMIF更好的所有原因感兴趣,但特别是,我有兴趣详细说明这里提到的以下几点:
IM的优点:
非常感谢.
是否有关于何时在Python中使用相对导入的规则或指南?我在Flask Web框架中一直看到它们一直在使用.在搜索这个主题时,我只看到有关如何使用相对导入的文章,但不是为什么.
使用时有一些特殊的好处:
from . import x
Run Code Online (Sandbox Code Playgroud)
而不是:
from package import x
Run Code Online (Sandbox Code Playgroud)
此外,我注意到在这个问题上,答案提到相对进口是不受欢迎的.然而人们仍然继续使用它们.
基本上我问这个问题同样的问题:如何在Python中进行相对导入?
但没有人给他一个正确的答案.鉴于你在一个子文件夹中,你想要上一个目录,然后进入另一个子文件夹,做他们建议的不起作用(正如OP在他的评论中指出的那样).
我知道你可以通过使用sys.path来做到这一点,但我更喜欢一个更干净的方法.
例:
App
__init__.py
Package_A
--__init__.py
--Module_A.py
Package_B
--__init__.py
--Module_B.py
Run Code Online (Sandbox Code Playgroud)
如何将Module_A导入Module_B?
我们使用py.test。我们尝试将不同的conftest.py文件放在不同的文件夹中以拆分我们的灯具:
tests/api/
??? conftest.py
??? folder1
? ??? conftest.py
??? folder2
? ??? conftest.py
Run Code Online (Sandbox Code Playgroud)
但是当运行测试时会出现这个错误:
____ ERROR collecting api/folder1/conftest.py ____
import file mismatch:
imported module 'conftest' has this __file__ attribute:
/tests/api/folder2/conftest.py
which is not the same as the test file we want to collect:
/tests/api/folder1/conftest.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
Run Code Online (Sandbox Code Playgroud)
这是为什么?怎么修?
附注。删除__pycache__.pyc没有帮助。
聚苯乙烯。__init__.py每个文件夹中已经存在文件。