似乎无法在 Python 的同一脚本中使用导入时间和导入日期时间

Posted

技术标签:

【中文标题】似乎无法在 Python 的同一脚本中使用导入时间和导入日期时间【英文标题】:Cannot seem to use import time and import datetime in same script in Python 【发布时间】:2012-06-28 00:37:03 【问题描述】:

我在 Windows 上使用 Python 2.7,并且正在编写一个同时使用时间和日期时间模块的脚本。我以前做过,但是 python 似乎对加载两个模块很敏感,而且我之前使用的方法似乎不起作用。以下是我使用的不同语法以及我目前遇到的错误。

首先我尝试过:

from datetime import *
from time import *
...
checktime = datetime.today() - timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = localtime(filetimesecs)
...
else: time.sleep(60)

错误:

else: time.sleep(60) AttributeError: 'builtin_function_or_method' object has no attribute 'sleep'

然后我尝试了:

from datetime import *
from time import *
...
checktime = datetime.today() - timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = localtime(filetimesecs)
...
#else: time.sleep(60)  # comment out time.sleep statement

我没有出错,但也没有睡眠延迟。

接下来我尝试了:

from datetime import *
import time
...
checktime = datetime.today() - timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = localtime(filetimesecs)
...
#else: time.sleep(60)  # comment out time.sleep statement

错误:

filetime = localtime(filetimesecs) NameError: name 'localtime' is not defined

另一个修改,我试过这个:

import time
import datetime
...
checktime = datetime.today() - timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = localtime(filetimesecs)
...
#else: time.sleep(60)  # comment out time.sleep statement

错误

checktime = datetime.today() - timedelta(days=int(2)) AttributeError: 'module' object has no attribute 'today'

最后,我尝试了这个:

import time
from datetime import *
...
checktime = datetime.today() - timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = localtime(filetimesecs)
...
#else: time.sleep(60)  # comment out time.sleep statement

错误:

checktime = datetime.today() - timedelta(days=int(2)) AttributeError: 'module' object has no attribute 'today'

所以我不确定如何让这两个模块很好地发挥作用。或者我需要另一种方法来延迟脚本。

建议?或者指出我犯的错误?

谢谢。

【问题讨论】:

好的,我一直在编码和测试,而你们一直在回答(谢谢!)。这就是我将导入行更改为“从时间导入时间,睡眠,本地时间从日期时间导入日期时间,timedelta”,这使得除了睡眠语句之外的一切都可以工作。如果我使用 'time.sleep(60)' 我得到 AttributeError: 'builtin_function_or_method' 对象没有属性 'sleep' 但如果我使用 'time.time.sleep(60)' 我得到相同错误。 好的,我一直在编码和测试,而你们一直在回答(谢谢!)。这是我将导入行更改为: from time import time, sleep, localtime from datetime import datetime, timedelta 这使得除了 sleep 语句之外的所有内容都可以工作。在使用 'time.sleep(60)' 然后 'time.time.sleep(60)' 之后,最终起作用的是 'sleep(60)' 相关:python “import datetime” v.s. “from datetime import datetime”。还有datetime.time类。 【参考方案1】:

永远不要使用from x import * 形式的导入,因为你不知道你会得到什么。在这种情况下,第二次导入会从第一次导入中删除一些符号,因为它们具有相同的名称。

要么使用import x 并使用x.y 限定您在该模块中使用的所有内容,或者使用from x import y 仅导入选定的项目。

【讨论】:

【参考方案2】:

不要使用from ... import *——这是一种方便交互使用的语法,会导致脚本混淆。

这是一个应该可以工作的版本:

import time
import datetime
...
checktime = datetime.datetime.today() - datetime.timedelta(days=int(2))
checktime = checktime.timetuple()
...
filetimesecs = os.path.getmtime(webgatelogdir + '/' + fn) 
file = webgatelogdir + '/' + fn
filetime = time.localtime(filetimesecs)
...
#else: time.sleep(60)  # comment out time.sleep statement

在使用import <modulename> 导入模块时,当然需要为这些模块中的所有名称使用完全限定名称

【讨论】:

【参考方案3】:

我的猜测是你有冲突是因为你的from something import *

由于datetime 导出time 类,这可能与time 模块冲突。

结论:不要使用import * ;-)

【讨论】:

【参考方案4】:

当你只做 import *.我强烈建议不要这样做。

import time
import datetime

.
.
.
.

time.sleep(60)

如果您不想在所有函数前面加上time.datetime.,也可以执行以下操作

from datetime import X, Y
from time import Z, W

X.something()
... etc ...

【讨论】:

没有time.time.sleep()。只是time.sleep()【参考方案5】:

这两个模块使用 sasme 名称定义了一些函数/类型。最好的方法是显式导入它们并使用你需要的东西:

import datetime
import time
datetime.datetime.today() # Datetime object for today
time.time() # Current time

更一般地说,您不能期望在from x import *import x 之间盲目切换。您需要查看每个库的文档来决定要使用哪些功能。

【讨论】:

【参考方案6】:

您可以在导入时间时使用as

import time as t
from datetime import datetime
...
t.sleep(2)

【讨论】:

这是最简单、最好、最简单的解决方案。 这是一个hack时间,从datetime导入时间与导入时间冲突【参考方案7】:

正如上面 cmets 中每个人都正确提到的那样,这个问题是由于:

from datetime import *

但是我遇到了一个问题,我将它写在一个文件中并尝试运行,由于它不起作用,我从该文件中删除了整个导入语句,但是当我尝试再次运行它时,它仍然是一样的错误。这很令人惊讶,因为当一个语句根本不在文件中时,它怎么会导致错误呢? 但是经过一些调试后,我意识到同样的语句在其他一些相互依赖的文件中,因此出现了错误。

所以,我想说的是,如果错误仍然存​​在,请检查项目中的所有文件是否有此语句,并将它们替换为要导入的特定模块,例如:

from datetime import datetime, timedelta

希望这会有所帮助!

【讨论】:

【参考方案8】:

你可以让它变得简单

from datetime import *

from time import *

【讨论】:

这是已经 OP 在问题中所做的,使用from X import *,这导致了错误。这就是为什么正如其他答案中提到的那样,尽可能避免import *。见Why is “import *” bad?。

以上是关于似乎无法在 Python 的同一脚本中使用导入时间和导入日期时间的主要内容,如果未能解决你的问题,请参考以下文章

Python无法在同一文件夹中找到模块

无法在Snakemake规则中使用conda环境导入python模块

从同一文件夹中的文件导入功能

已安装包(Python PIL/Pillow)但我无法导入它

Python导入并运行位于不同目录中的python脚本[重复]

如何在同一个 python 脚本中使用 sys 和 argparse 而不会出现无法识别的参数错误?