Python 导入相对路径
Posted
技术标签:
【中文标题】Python 导入相对路径【英文标题】:Python imports relative path 【发布时间】:2015-01-07 02:42:31 【问题描述】:我有一个项目,我想使用位于其他目录中的一些 python 类。
示例结构:
/dir
+../subdirA
+../subdirB
+../mydir
绝对路径不同,因为这个项目是在不同的机器上运行的。
当我的 MySampleClass 位于 /mydir 的 python 文件被执行时,我如何导入 /dirOtherClassRoot /em> 或 OtherClassA 位于 /subdirA?
我尝试过这样的事情:
from . import MySampleClass as msc
或
from ../ import MySampleClass as msc
但这总是失败或给我错误消息,例如 Attempted relative import in non-package
那么,相对导入python文件的正确方法是什么?
【问题讨论】:
您是否阅读过 Python 文档中关于 Packages 的部分?您可能还会发现我在this answer 中发布的示例代码很有帮助。 【参考方案1】:你需要在 mydir 目录中有一个__init__.py
(它可以是空的),然后只要 dir 在 sys 路径中,假设你的 MySampleClass 在 myfile.py 中并且 myfile.py 在 mydir 中
from mydir.myfile import MySampleClass
如果您想将位于 subdirA 中的名为 util.py 的文件中的***函数导入 myfile.py(您的类所在的位置),则 __init__.py
必须在 subdirA 中,然后在 myfile.py 中
from subdirA.util import somefunc, someotherfunc
sys 路径也是如此,即必须从 'dir' 开始或添加它。一切都是从包的顶层导入的(通常是你的项目文件夹)。
但是,对于模块测试,您可以在解释器中从 util 运行函数,如果您从 subdirA 开始,则需要将 dir 添加到 sys 路径,以便您的导入可以解析。
>>> import sys
>>> sys.path.append('../dir')
但这是一种 hack,最好仅在您进行测试时从交互式解释器中使用。您还可以将“dir”添加到 pth 文件中的站点包中。
要使用相对导入,您需要更深的嵌套文件夹,例如 subdirA/subdirofA,然后在 subdirofA 中,您可以使用 .退出(如 from .subdirB
)。真的,对我来说,相对进口有点难以看到实用性。 相对于项目目录对我来说使用直接导入会更好,但如果你想嵌套一个简单的子包,我可以看到它们很有用,但同样,如果可能的话,显式比隐式更好.
另见this
【讨论】:
我猜你误会了(或者我解释错了^^):MySampleClass 位于 mydir 并被执行。所以我想从 subdirA, subdirB, ... 导入一些其他人的类到 MySampleClass (位于 myfile.py 在 /mydir)【参考方案2】:先将相对路径添加到pythonpath
import os
import sys
cwd = os.getcwd()
sys.path.append(cwd + '/../subdirA/')
sys.path.append(cwd + '/../subdirB/')
然后导入模块。
【讨论】:
【参考方案3】:目录结构如下:
/dir
+../subdirA
+../subdirB
+../mydir
结合linux命令ln
,我们可以让事情变得简单很多:
1. cd dir/mydir
2. ln -s ../subdirA ./
3. ln -s ../subdirB ./
而且,现在如果您想将 some_stuff
从文件:dir/subdirA/fileA.py
导入到您的文件:dir/mydir/myfile.py
,只需像这样导入:
from subdirA.fileA import some_stuff
而且,同样适用于 'dir/subdirB'
更重要的是,这适用于setup.py
进程,:)
【讨论】:
我们都知道有很多技巧可以解决这个问题,例如:../
、__init__.py
,它们很好但不够简单,这是我最容易维护和最简单的方法到目前为止发现,期待更好和更简单的解决方案!以上是关于Python 导入相对路径的主要内容,如果未能解决你的问题,请参考以下文章