假设我的项目结构如下:
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才能完成这项工作..
答案 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.py
或create 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