2015-02-13 2 views
2

Я пытаюсь инициализировать строковую переменную в Python, используя пакет datetime. Я ожидаю, что строка останется прежней, как только она будет инициализирована, но по какой-то странной причине (по крайней мере, странной для меня) она меняется.Python - String с изменением временной метки

По сути, когда я пытаюсь:

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\ #!!! 

Это как если я получаю доступ к переменной каталога журналов, он возвращается и переоценивает base_directory переменная снова, вместо того, чтобы восстановить значение base_directory, уже установлено. Является ли это предполагаемой функциональностью в Python? Это не так, поскольку я не могу вызвать эту проблему из оболочки IDLE - это происходит только при запуске моей программы Python из pydev. Однако, если это предназначенная функциональность, как мне переписать мой код для достижения ожидаемых результатов? Благодаря!

Я не уверен, что это актуально, но я получаю доступ к этой переменной в тестах на носовые узлы. Это в 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\ 

Что происходит? Почему нос переоценивает строки, которые уже были инициализированы? Как переписать мой код так, чтобы он выполнял то, что я ожидал? Благодаря!

+0

Это, безусловно, не нормальное поведение. Вы не вызываете эту функцию дважды случайно? –

+0

Нет, я нет. Это единственные места, где в коде установлены две переменные каталога.Единственное предостережение здесь в том, что я обращаюсь к переменной logs_directory из теста носовой единицы (переменные инициализируются до того, как выполняется единичный тест). Я не уверен, что есть какой-то артефакт в носу или, может быть, мой проект, который вызывает эту проблему. Я очень новичок в тестировании носа на Python. – benjammin

+0

Строки неизменны в Python. 'base_directory' не изменится, если вы не назначили ему новую строку. Несвязанный: вы можете использовать 'time.strftime ('% m-% d-% Y.% I_% M_% S_% p')', если вы не используете директивы, которые поддерживаются только модулем datetime. Для запуска скрипта используйте обычный интерпретатор 'python'. Если проблема сохраняется, тогда [укажите кратчайшую программу, которая ее демонстрирует] (http://stackoverflow.com/help/mcve) – jfs

ответ

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__.timestamp и module_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 файл и запустить.

+0

Получил это. Я понятия не имел, что нос реимпортировал модуль за кулисами. Я реорганизую свой код, чтобы избежать этого ужасного двойного импорта. Спасибо! – benjammin

+0

@benjammin: «нос» должен импортировать тесты, если они находятся в других модулях (что «nosetests» делает), но я не уверен, является ли это ошибкой, которая реимпортирует модуль, который запускает 'nose.main()'. Простой обходной путь: не ставьте тесты в скрипт с 'nose.main()' в нем. – jfs

 Смежные вопросы

  • Нет связанных вопросов^_^