用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中使用)中,这可以表示一个名为fooFooFOOfOofoOFoOFOofOO 。 所有这些都是有效的,不同的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