У меня есть файл test.txt, который находится внутри zip-архива test.zip. Разрешения на test.txt находятся вне моего контроля, когда он сжат, но теперь я хочу, чтобы они были доступны для групповой записи. Я извлекаю файл с помощью Python и не хочу уходить в оболочку.
Обновлено: Вот что у меня есть на данный момент:
import zipfile
z = zipfile.ZipFile('test.zip', 'w')
zi = zipfile.ZipInfo('test.txt')
zi.external_attr = 0777 << 16L
z.writestr(zi, 'FOO')
z.close()
z = zipfile.ZipFile('test.zip', 'r')
for name in z.namelist():
newFile = open(name, "wb")
newFile.write(z.read(name))
newFile.close()
z.close()
Это отлично работает в OS X с использованием 2.5.1, но не работает в моем домашнем компьютере (Debian, Python 2.4 и 2.5) или в RHEL 5 с Python 2.4. Ни на чем, кроме OS X, это не ошибка, но и разрешения не меняются. Есть идеи, почему? Кроме того, как работает writestr()? Я знаю, что здесь неправильно использую.
Есть ли способ сделать это без os.chmod (пользователь, извлекающий файл, не имеет прав на использование os.chmod после его извлечения)? У меня есть полный доступ на запись к zip-файлу.
Больше информации:
> ls -l test.zip
-rwxrwxrwx 1 myuser mygroup 2008-11-11 13:24 test.zip
> unzip test.zip
Archive: test.zip
inflating: test.txt
> ls -l test.txt
-rw-r--r-- 1 myuser mygroup 2008-11-11 13:34 test.txt
Пользователь распаковывает не myuser, а mygroup.
Не уверен, что вы имеете в виду. Linux ведет себя нормально, хотя Python ведет себя по-другому в OS X.
Ну, вы сказали: «Это работает в OS X, а не в Debian». Если вы сказали, почему это не работает, возможно, разместили какой-то код или сообщения об ошибках, кто-то может помочь. Просто мысль.
А, я понимаю, что вы имеете в виду. Сегодня мозг не работает должным образом.
Пользователь может разархивировать, но не может os.chmod? звучит странно.
Да, они могут писать в каталог, но файл внутри zip-архива не доступен для групповой записи. Странная ситуация.






Согласно документации, unzip устанавливает разрешения для тех, которые хранятся в unix. Также не используется оболочка umask. Лучше всего убедиться, что завивки установлены, прежде чем архивировать файл.
Поскольку вы не можете этого сделать, вам придется попробовать сделать то, что вы пытались сделать (и заставить это работать под Debian.)
С библиотекой zipfile Pythons возник ряд проблем, в том числе установка режима Writestr для файла, записываемого в некоторых системах, или установка zip systm на windows вместо unix. Таким образом, ваши противоречивые результаты могут означать, что ничего не изменилось.
Так что, возможно, вам совсем не повезло.
Распаковать в стандартный вывод (распаковать -p) и перенаправить в файл? Если в ZIP-архиве более одного файла, вы можете перечислить их содержимое, а затем извлекать их по одному.
for n in `unzip -l test.zip | awk 'NR > 3 && NF == 4 { print $4 }'`; do unzip -p test.zip $n > $n; done
(да, я знаю, что вы пометили этот «питон» :-))
У меня была аналогичная проблема с вами, поэтому вот код из моих материалов, я считаю, что это должно помочь здесь.
# extract all of the zip
for file in zf.filelist:
name = file.filename
perm = ((file.external_attr >> 16L) & 0777)
if name.endswith('/'):
outfile = os.path.join(dir, name)
os.mkdir(outfile, perm)
else:
outfile = os.path.join(dir, name)
fh = os.open(outfile, os.O_CREAT | os.O_WRONLY , perm)
os.write(fh, zf.read(name))
os.close(fh)
print "Extracting: " + outfile
Вы можете сделать что-то подобное, но вставьте свою собственную логику для расчета значения химической завивки. Я должен отметить, что здесь я использую Python 2.5, я знаю о некоторых несовместимости с некоторыми версиями поддержки zip-файлов Python.
Еще вы могли бы подробно рассказать о своих проблемах в Linux, так как кто-то здесь может помочь, но вы не дали ничего, чтобы продолжить.