你需要在mydir目录下创建一个名为
__init__.py
的文件(可以为空),然后只要dir在sys路径中,假设你的MySampleClass在myfile.py中且myfile.py在mydir中。
from mydir.myfile import MySampleClass
如果你想把位于subdirA下名为util.py的文件中的顶级函数导入到myfile.py(你的类所在的地方),那么subdirA中必须有一个__init__.py文件,然后在myfile.py中导入。
from subdirA.util import somefunc, someotherfunc
sys路径也是如此,即您必须从“dir”开始或添加它。从包的顶层(通常是您的项目文件夹)导入所有内容。
但是,对于模块测试,在解释器中可能会运行来自util的函数,如果您从subdirA开始,则需要添加dir到sys路径,以便您的导入可以解析。
>>> import sys
>>> sys.path.append('../dir')
但这只是一种hack方法,最好只在测试时从交互式解释器中使用。您还可以在.pth文件中将“dir”添加到您的网站包中。
要使用相对导入,您需要一个更深嵌套的文件夹,例如subdirA/subdirofA,然后在subdirofA中,您可以使用.来回退(如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'>
>>>