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 导入相对路径的主要内容,如果未能解决你的问题,请参考以下文章

python3绝对路径,相对路径

在Python中以绝对路径或者相对路径导入文件(或模块)的方法

从 Python 中的相对路径导入

Python 包内的导入问题(绝对导入和相对导入)

从相对路径导入模块

模块之相对路径导入