Python导入相对路径



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

示例结构:

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

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

当执行位于/mydir中的MySampleClass的python文件时,我如何导入位于/dir/subdirA内的OtherClassRoot

我试过类似的东西:

from . import MySampleClass as msc

from ../ import MySampleClass as msc

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

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

您将需要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运行函数,如果您从subdrA开始,则需要将dir添加到sys路径中,这样您的导入就可以解析。

>>> import sys
>>> sys.path.append('../dir')

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

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

也可以看到这个

Python 3命名空间包的更新。不再需要__init__.py文件。某些库可能仍然引用该文件,因此可能仍然需要它来实现兼容性。例如,

(test-env) machine:~ user$ mkdir new_package
(test-env) machine:~ user$ python
>>> import new_package
>>> new_package.__file__
>>> type(new_package.__file__)
<class 'NoneType'>
>>>
(test-env) machine:~ user$ touch new_package/__init__.py
(test-env) machine:~ user$ python
>>> import new_package
>>> new_package.__file__
'/Users/user/new_package/__init__.py'
>>> type(new_package.__file__)
<class 'str'>
>>>

首先将相对路径添加到pythonpath

import os
import sys
cwd = os.getcwd()
sys.path.append(cwd + '/../subdirA/')
sys.path.append(cwd + '/../subdirB/')

然后导入模块。

目录结构如下:

/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

同样适用于"目录/子目录B"

此外,这适用于setup.py进程,:)

最新更新