我有一个项目,我想使用其他目录中的一些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
进程,:)