我有一个项目,我想在其他目录中使用一些python类。
示例结构:
/dir
+../subdirA
+../subdirB
+../mydir
绝对路径会有所不同,因为此项目在不同的计算机上运行。
当执行 / mydir 中 MySampleClass 的python文件时,如何导入位于 / dir <中的 OtherClassRoot 位于 / subdirA 中的/ em>或 OtherClassA ?
我尝试过这样的事情:
from . import MySampleClass as msc
或
from ../ import MySampleClass as msc
但是这总是失败或者给我一些错误消息,例如在非包裹中试图相对导入
那么,有什么方法可以相对导入python文件吗?
非常感谢任何输入:)
答案 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
进程,:))