[devel] python looses milisecond (was: archivemail: требуется помощь)
Grigory Batalov
=?iso-8859-1?q?bga_=CE=C1_altlinux=2Eorg?=
Чт Мар 13 22:36:26 MSK 2008
On Thu, 13 Mar 2008 02:11:29 +0500, Andrey Rahmatullin wrote:
> > $ ls -la --time-style=full-iso test.txt
> > -rw-r--r-- 1 builder builder 0 2008-03-12 23:47:55.737319000 +0300 test.txt
> > $ python test.py
> > $ ls -la --time-style=full-iso test.txt
> > -rw-r--r-- 1 builder builder 0 2008-03-12 23:47:55.737318000 +0300 test.txt
> Ох.
> Это баг в os.utime?
Налицо две проблемы:
1. stat(2) оперирует с точностью до наносекунд (struct stat: st_mtim.tv_nsec),
а utimes(2) - до милисекунд (struct timeval: tv_usec). Так что сравнивать
время модификации файла до и после utimes со стороны test_archivemail.py
неосмотрительно =).
2. комбинация os.path.getmtime/os.utime таки не просто округляет время
до меньшего, но умудряется иногда терять милисекунду:
$ touch test.txt
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793640217 +0300 test.txt
$ python ~/test.py
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793640000 +0300 test.txt
$ python ~/test.py
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793639000 +0300 test.txt
$ python ~/test.py
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793638000 +0300 test.txt
$ python ~/test.py
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793637000 +0300 test.txt
$ gcc -Wall -g -o ~/test ~/test.c
$ ~/test
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793637000 +0300 test.txt
$ ~/test
$ ls -la --time-style=full-iso test.txt
-rw-r--r-- 1 bga bga 0 2008-03-13 22:16:55.793637000 +0300 test.txt
--------------
$ cat ~/test.py
#!/usr/bin/python
import os
file = "test.txt"
mtime = os.path.getmtime(file)
atime = os.path.getatime(file)
os.utime(file, (atime, mtime))
--------------
$ cat ~/test.c
#include <sys/types.h>
#include <utime.h>
#include <sys/time.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
int errno;
int main(int argc, char *argv[]) {
struct timeval tvp[3];
char filename[] = "test.txt";
struct stat st;
if (stat(filename, &st) == -1) {
perror("stat");
return -1;
}
tvp[0].tv_sec = st.st_atim.tv_sec;
tvp[0].tv_usec = st.st_atim.tv_nsec/1000;
tvp[1].tv_sec = st.st_mtim.tv_sec;
tvp[1].tv_usec = st.st_mtim.tv_nsec/1000;
tvp[2].tv_sec = st.st_ctim.tv_sec;
tvp[2].tv_usec = st.st_ctim.tv_nsec/1000;
if (utimes(filename, tvp) == -1)
perror("utimes");
return 0;
}
--
Grigory Batalov,
ALT Linux Team
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20080313/8b37ba2f/attachment-0002.bin>
Подробная информация о списке рассылки Devel