2016-09-23 3 views
2

Итак, я пишу инструмент, который будет считывать время из файла с помощью графического интерфейса пользователя на основе python 3.52 и Qt5. Минимальная операцияКонфликт между PyQt5 и datetime.datetime.strptime

datetime.datetime.strptime('Tue', '%a') 

работает в изолированной среде, давая выход "1900-01-01 00:00:00". Тем не менее, когда я запускаю следующий минимальный пример

import sys 
import datetime as datetime 

from PyQt5 import QtWidgets 

if __name__ == '__main__' : 
    print(datetime.datetime.strptime('Tue', '%a')) 
    app = QtWidgets.QApplication(sys.argv) 
    print(datetime.datetime.strptime('Tue', '%a')) 
    #sys.exit(app.exec_()) 

я получить выход

1900-01-01 00:00:00 
Traceback (most recent call last): 
File "/home/user/gui/testfile.py", line 11, in <module> 
print(datetime.datetime.strptime('Tue', '%a')) 
File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime 
tt, fraction = _strptime(data_string, format) 
File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime 
(data_string, format)) 
ValueError: time data 'Tue' does not match format '%a' 

так, то первый вызов strptime процедура работает отлично, но после QApplication создается класс , он больше не работает. Обратите внимание, что дальнейшее использование QApplication для создания графического интерфейса и выполнения множества сложных задач с ним отлично работает. Единственное, что не работает в настоящее время: strptime

Любая идея, что пойдет не так?

+0

Я попробовал ваш сценарий, и я не могу воспроизвести, он не откажет здесь (3.5.1 x64, QT_VERSION_STR = 5.7.0, PYQT_VERSION_STR = 5.7, win7) – BPL

ответ

1

я могу воспроизвести проблему: после вызова QtWidget, в

print(datetime.datetime.strptime('Tue', '%a'))

заканчивается ошибкой.

Если я исполняю после QtWidget

print(datetime.datetime.strptime('Die', '%a')) это работает.

Я нахожусь в Швейцарии, так Die на немецком языке эквивалентно Втр.

Похоже, что Qt каким-то образом влияет на настройки региона, так как% A и% a оценивает имя местного рабочего дня (Datetime). Может быть, эксперт Qt может объяснить более подробно, что происходит.

+0

Ничего себе, кто бы мог подумать ... –

+0

Вероятно, он называет ['setlocale (LC_ALL, '')'] (https: // linux .die.net/man/3/setlocale) или эквивалент в какой-то момент во время его инициализации – mata

0

Выработать на хороший ответ Патрик, я теперь нашел способ отменить локализацию вынужденное на QT

import sys 
import datetime as datetime 
import locale 

from PyQt5 import QtWidgets 

## Start the QT window 
print(datetime.datetime.strptime('Tue', '%a')) 
app = QtWidgets.QApplication(sys.argv) 
locale.setlocale(locale.LC_TIME, "en_GB.utf8") 
print(datetime.datetime.strptime('Tue', '%a')) 
#sys.exit(app.exec_()) 
+0

Обратите внимание, что это будет работать, только если в os установлена ​​локаль 'en_GB.utf8', иначе она вызовет исключение. [Default при запуске программы] (https://linux.die.net/man/3/setlocale) является языковым признаком 'C', поэтому, чтобы быть портативным, вы можете использовать его. – mata

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