Python中的相对导入3

时间:2016-05-10 12:54:33

标签: python python-3.x python-import

假设我的项目结构如下:

WebElement currency = dropDownListBox.findElement(By.linkText("Australian Dollar"));
currency.click();

在foo.py中,我有

myproject
├── calendar.py
├── foo.py
└── __init__.py

我认为在Python 3.x中,不使用显式的 .calendar ,上面的代码应该加载内置日历模块而不是我自己的日历模块,但显然我的本地calendar.py仍在导入,它会引发错误,因为没有' isleap'在mypkg / calendar.py中。为什么我的本地日历模块是在这里导入的?

我必须将calendar.py重命名为cal.py才能完成这项工作..

3 个答案:

答案 0 :(得分:2)

看起来您的路径或目录结构设置错误。

鉴于以下结构,日历模块的全名应为myproject.calendar。您可以通过打印模块的__name__属性来检查这一点。对于这种情况,程序用于导入本地模块的路径必须是包含myproject的文件夹。

myproject
├── calendar.py
├── foo.py
└── __init__.py

您使用的路径似乎实际上是myproject。含义calendar.py已转换为根级模块calendar,而不是myproject.calendar。 Python更喜欢本地模块到内置模块,因此导入calendar模块。

更典型的是,你可能会做这样的事情。

MyProjectFolder
├── main.py
└── myproject
    ├── calendar.py
    ├── foo.py
    └── __init__.py

然后像这样运行你的程序:

#! /bin/bash
cd /path/to/MyProjectFolder
python main.py

答案 1 :(得分:2)

from __future__ import absolute_import是Python 3的默认值。因此from calendar import isleap语句会导入顶级模块calendar

如果你看到其他结果;它意味着要么你没有使用Python 3,要么你试图从一个包里面运行一个python模块作为脚本(myproject目录本身在sys.path)。如果是后者,那么您的calendar.py将成为顶级模块,并且(由于当前目录位于sys.path中的stdlib目录之前)from calendar import isleap从当前目录导入calendar.py"Never add a package directory, or any directory inside a package, directly to the Python path"

为避免这种情况,请不要直接在python包中运行模块,例如,不要这样做:cd myproject; python foo.py。请改为:python -mmyproject.foo(或者您可以define what scripts should be run in setup.pycreate a similar script manually: from myproject import foo; foo.main())。

如果您想将Python包作为脚本运行,请创建myproject/__main__.py,然后运行python -mmyproject

如果你想在Python 3中进行相对导入;明确地这样做,例如myproject/foo.py

from .calendar import something

或者进行绝对导入:

from myproject.calendar import something

答案 2 :(得分:-1)

Python将检查您的本地模块并首先通过RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 加载它们。

.htaccess将首先搜索您的语言环境包中的模块import。如果找不到,它将从内置库from calendar import isleap导入。

calendar只会从您的语言环境模块calendar导入。如果找不到,则引发异常from .calendar import isleap

这就是你应该在包中使用相对导入的原因。

你可以这样做,导入内置库而不检查本地模块。但这只是一个伎俩。我永远不会在生产中使用它。您最好重命名模块calendar

ImportError