用Python导入包
我可能错过了一些明显的东西,但无论如何:
当你在python中导入一个像os
这样的包的时候,你可以使用任何子模块/子包。 例如这个工程:
>>> import os >>> os.path.abspath(...)
不过,我有我自己的软件包,其结构如下:
FooPackage/ __init__.py foo.py
这里同样的逻辑不起作用:
>>> import FooPackage >>> FooPackage.foo AttributeError: 'module' object has no attribute 'foo'
我究竟做错了什么?
您需要导入子模块:
import FooPackage.foo
你在做的是在FooPackage/__init__.py
寻找foo
。 你可以通过将import FooPackage.foo as foo
(或from . import foo
FooPackage/__init__.py
)放入到FooPackage/__init__.py
,那么Python将能够在那里findfoo
。 但我build议使用我的第一个build议。
当您导入FooPackage
,Python将searchPYTHONPATH上的目录,直到find名为FooPackage.py
的文件或名为FooPackage.py
的目录( FooPackage
包含名为__init__.py
的文件)。 但是,find软件包目录后,它不会再扫描该目录并自动导入所有的.py文件。
这种行为有两个原因。 首先是导入一个模块执行Python代码可能需要时间,内存或有副作用。 所以你可能想导入abcd
而不一定要导入一个巨大的包。 包devise者决定__init__.py
是否明确地导入它的模块和子包以使它们始终可用,或者让客户端程序能够select和加载哪些东西。
第二个是更微妙一点,也是一个showstopper。 如果没有明确的导入语句(无论是在FooPackage/__init__.py
还是在客户端程序中),Python并不一定知道应该将foo.py
导入为什么名称。 在不区分大小写的文件系统(如Windows中使用)中,这可以表示一个名为foo
, Foo
, FOO
, fOo
, foO
, FoO
, FOo
或fOO
。 所有这些都是有效的,不同的Python标识符,所以Python只是没有足够的来自文件的信息来知道你的意思。 因此,为了在所有系统上保持一致,它需要一个明确的导入语句来澄清名称,即使是在提供完整案例信息的文件系统上。
你需要添加from . import foo
from . import foo
包中的__init__.py
文件。
您可以使用import语句从库中导入包。
语法:import module_name
ex: import math
您可以通过使用blow语法只导入一个包的特定方法
语法:从module_name导入函数名称
ex: from math import radians