Importing packages in Python
我可能遗漏了一些明显的东西,但无论如何:
当您在python中导入像
1 2 | >>> import os >>> os.path.abspath(...) |
但是,我有自己的包,其结构如下:
1 2 3 | FooPackage/ __init__.py foo.py |
号
在这里,同样的逻辑不起作用:
1 2 3 | >>> import FooPackage >>> FooPackage.foo AttributeError: 'module' object has no attribute 'foo' |
我做错什么了?
当导入
这种行为有两个原因。第一个问题是导入模块会执行可能需要时间、内存或有副作用的python代码。因此,您可能希望导入
第二个更微妙,同时也是一个展示的拦路虎。如果没有明确的导入语句(在
您需要导入子模块:
1 | import FooPackage.foo |
你要做的是在
您需要将
有一些重要的误解需要解决,特别是用术语。首先,通常,当您认为在python中导入
您可以检查
1 2 | import os print(type(os)) # will print: <type 'module'> |
。
在您的示例中,当您执行
在
考虑您的原始结构:
1 2 3 | FooPackage/ __init__.py foo.py |
案例1:uuu init_uuuuy是一个空文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #FooPackage imported as a module import FooPackage #foo is not a name defined in `__init__.py`. Error FooPackage.foo #FooPackage.foo imported as a module import FooPackage.foo #Error, foo has not been imported. To be able to use foo like this, #you need to do: import FooPackage.foo as foo foo.anything #Not error, if anything is defined inside foo.py FooPackage.foo.anything |
。
案例2:uuinit_uuu.py中有行
1 2 3 4 5 | import FooPackage #Now this is good. `foo` is sort of considered to be an attribute of #FooPackage FooPackage.foo |
。
现在,假设foo不再是
可以使用import语句从库中导入包。
syntax : import module_name
号
1 | ex: import math |
号
通过使用blow语法,只能从包中导入特定方法
syntax : from module_name import function_name
号
1 | ex: from math import radians |