Python - 时间戳更改的字符串

时间:2015-02-13 20:08:05

标签: python python-2.7 timestamp python-import nose

我尝试使用datetime包在Python中初始化字符串变量。我希望字符串在初始化后保持不变,但由于一些奇怪的原因(至少对我来说很奇怪),它会发生变化。

基本上,当我尝试时:

timestamp = datetime.datetime.now().strftime('%m-%d-%Y.%I_%M_%S_%p')
base_directory = "C:\\Users\\Ben\\report_" + timestamp + "\\"
print base_directory #prints C:\Users\Ben\report_02-13-2015_02_02_24_PM
time.sleep(5)
logs_directory = base_directory + "logs\\"

当我回去使用logs_directory变量时,我希望它是

C:\Users\Ben\report_02-13-2015_02_02_24_PM\logs\

然而,它是:

C:\Users\Ben\report_02-13-2015_02_02_29_PM\logs\ #!!!

好像当我访问logs目录变量时,它会返回并再次重新评估base_directory变量,而不是检索值base_directory已被设置为。这是Python中的预期功能吗?我不是因为我似乎无法从IDLE shell触发这个问题 - 它只发生在我从pydev运行我的Python程序时。但是,如果这是预期的功能,我如何重写我的代码以实现我期望的结果?谢谢!

我不确定它是否相关,但我在鼻子单元测试中访问此变量。这是在Python 2.7中。


更新:这里有一些独立的代码可以更好地说明正在进行的操作。事实上,它确实看起来与鼻子有某种关系:

import nose, os, sys, time

timestamp = time.strftime('%m-%d-%Y.%I_%M_%S_%p')
base_directory = "C:\\Users\\Ben\\Desktop\\report_" + timestamp + "\\"
logs_directory = base_directory + "logs\\"

def test_me():
    print base_directory
    print logs_directory

if __name__ == '__main__':
    os.makedirs(base_directory)
    os.makedirs(logs_directory)
    print base_directory
    print logs_directory

    time.sleep(5)

    #Without the nocapture argument, nose will internally log all
    #stdout output, and will not output anything to the console.
    argv = (sys.argv[:])
    argv.insert(1, "--nocapture")
    nose.main(argv=argv)  #This will run test_me()

这是输出:

C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_37_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_37_PM\logs\

我在期待:

C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\

发生了什么?为什么鼻子会重新评估已经初始化的字符串?如何重写我的代码以使其达到我的期望?谢谢!

1 个答案:

答案 0 :(得分:2)

我可以重现这个问题:

#!/usr/bin/env python
import time

timestamp = time.strftime('%S')

def test_me():
    print('test_me ' + timestamp)
    assert 0

if __name__ == '__main__':
    import nose # $ pip install nose
    print('main ' + timestamp)
    time.sleep(3)
    nose.main()

print('main ' + timestamp)print('test_me ' + timestamp)显示不同的结果。

nose在睡眠后内部导入模块,因此timestamp不同:实际上有两个对象__main__.timestampmodule_name.timestamp

如果模块既作为脚本运行又可以导入,则该模块不应具有可变的全局状态。请参阅Executing the main module twice

这是一个没有nose的例子:

#!/usr/bin/env python
"""Execute main module twice."""
import time

timestamp = time.strftime('%S')

def print_timestamp(prefix):
    print(prefix + timestamp)

if __name__ == '__main__':
    print_timestamp('main')
    time.sleep(3)
    import test_exec_main_twice
    test_exec_main_twice.print_timestamp('module')

将其保存到test_exec_main_twice.py文件并运行。