这是一个python新手问题:
我有以下目录结构:
test
-- test_file.py
a
-- b
-- module.py
其中test
,a
和b
是文件夹。 test
和a
都处于同一级别。
module.py有一个名为shape
的类,我想在test_file.py中实例化它的一个实例。我怎么能这样做?
我试过了:
from a.b import module
但我得到了:
ImportError: No module named a.b
答案 0 :(得分:18)
你想要的是一个相对导入,如:
from ..a.b import module
这样做的问题是,如果您将test_file.py作为主模块,则它不起作用。如上所述here:
请注意,显式和隐式相对导入都基于当前模块的名称。由于主模块的名称始终为“ main ”,因此用作Python应用程序主模块的模块应始终使用绝对导入。
因此,如果您想将test_file.py
作为主要模块,那么您应该考虑更改模块的结构并使用绝对导入,否则只需使用上面的相对导入。
答案 1 :(得分:13)
目录a
需要是一个包。添加一个__init__.py
文件使其成为一个包,这是一个简单的目录。
目录b
也需要是a
的子包。添加__init__.py
文件。
目录test
也可能是一个包。很难说这是否有必要。对于每个Python模块目录来说,通常一个好主意是正式的包。
要import
,套餐必须在sys.path
;这是从PYTHONPATH
环境变量构建的。默认情况下,已安装的站点包和当前工作目录(有效地)是唯一可以找到包的两个位置。
这意味着必须安装a
,或者,您当前的工作目录也必须是高于a
一级的包。
或者,您需要将PYTHONPATH
环境变量设置为包含a
。
http://docs.python.org/tutorial/modules.html#the-module-search-path
http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH
另外,http://docs.python.org/library/site.html有关sys.path
如何构建的完整信息。
答案 2 :(得分:10)
要做的第一件事就是快速浏览the official docs on this。
要将目录设为包,您必须添加__init__.py
文件。这意味着您将在a
和b
目录中拥有此类文件。然后你可以直接做一个
import a.b.module
但是您必须将其称为a.b.module
,这是单调乏味的,因此您可以使用导入的as
形式
import a.b.module as mod #shorter name
并将其称为mod
。
然后,您可以使用常规约定mod
来实例化mod.shape()
内的内容。
还有其他一些细微之处。请仔细阅读文档了解详情。