Python导入相对路径

2024-04-18 00:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我想使用一些位于其他目录中的python类。

示例结构:

/dir
 +../subdirA
 +../subdirB
 +../mydir

绝对路径不同,因为此项目在不同的计算机上运行。

当执行位于/my dir中的带有MySampleClass的python文件时,如何导入位于/dir中的OtherClassRoot或位于/subdir中的OtherClassA

我尝试过这样的事情:

from . import MySampleClass as msc

或者

from ../ import MySampleClass as msc

但这总是失败或给我错误消息,比如试图在非包中进行相对导入

那么,相对导入python文件的正确方法是什么?


Tags: 文件项目fromimport目录示例as计算机
3条回答

在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')

但这是一个黑客,最好在测试时只使用交互式解释器。您还可以将“dir”添加到pth文件中的站点包中。

要使用相对导入,您需要一个更深层次的嵌套文件夹,如subdirA/subdirofA,然后在subdirofA中可以使用。退出(比如from .subdirB)。实际上,对我来说,相对进口有点难以看到效用。对于我来说,最好使用直接导入相对于项目目录,但是如果您想要嵌套一个天真的子包,我可以看到它们是有用的,但是,如果可能的话,还是显式比隐式更好。

另见this

在dir结构上,如下所示:

/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/subdir”也是如此

而且,这对setup.py进程有效,:)

首先将相对路径添加到pythonpath

import os

import sys

cwd = os.getcwd()

sys.path.append(cwd + '/../subdirA/')

sys.path.append(cwd + '/../subdirB/')

然后导入模块。

相关问题 更多 >

    热门问题