Python导入相对路径

时间:2014-11-10 17:51:31

标签: python import path relative

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

示例结构:

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

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

当执行 / mydir MySampleClass 的python文件时,如何导入位于 / dir <中的 OtherClassRoot 位于 / subdirA 中的/ em>或 OtherClassA

我尝试过这样的事情:

from . import MySampleClass as msc

from ../ import MySampleClass as msc

但是这总是失败或者给我一些错误消息,例如在非包裹中试图相对导入

那么,有什么方法可以相对导入python文件吗?

非常感谢任何输入:)

3 个答案:

答案 0 :(得分:19)

你需要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')

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

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

另见this

答案 1 :(得分:2)

首先添加pythonpath的相对路径

.gr-body {
background: url(http://orig14.deviantart.net/8b57/f/2016/279/f/5/frontpagebackground_by_wulfghast-dak5apt.jpg);
background-size: 100%;
background-repeat: no-repeat;
background-color: #1c1119;
color: #545454; }

.header {
background-image: url(http://s10.postimg.org/bvl7xjjbd/branchborder.png);
background-position: top center;
background-repeat: no-repeat;
background-size: contain;
 margin-left: auto;
margin-right: auto;
margin-top: 20%;
position: relative;
z-index: 2;
height: 873px;
width: 74%;
display: block; }

.contentholder {
width: 68%;
margin-left: auto;
margin-right: auto;
margin-top: -800px;
-moz-box-shadow: 0 0 20px 5px #0a0a0a;
-webkit-box-shadow: 0 0 20px 5px #0a0a0a;
box-shadow: 0 0 20px 5px #0a0a0a;
background-color: #50463b;
position: relative;
z-index: 1;
display: block; }

.rockfooter {
background: url(http://s17.postimg.org/is79jxd3z/footer3_by_wulfghast_dakd92b_1.png);
height: 1000px;
width: 100%;
background-position: bottom;
background-repeat: no-repeat;
background-size: contain;
margin-left: auto;
margin-right: auto;
margin-top: -985px;
position: relative;
z-index: 4; }

.bottom {
display: none; }

然后导入模块。

答案 2 :(得分:-2)

在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

同样适用于&#39; dir / subdirB&#39;

更多内容,这适用于setup.py进程,:))