使用python zipfile归档符号链接

使用python zipfile归档符号链接,python,zip,symlink,zipfile,Python,Zip,Symlink,Zipfile,我有一个脚本,可以创建包含符号链接的dir的zip文件。我 我惊讶地发现拉链已经拉上了目标的拉链 链接,而不是链接本身,这是我想要的和 预期。有人知道如何让zipfile压缩链接吗?似乎不支持存储符号链接。将它们存储在ZIP中的方式实际上不是格式的一部分。特别是,InfoZip的实现支持它们,因此您可以。请确保您的解压软件能够处理此类存档—正如我所说,此功能不是标准化的。可以使用zipfile存储符号链接,而不是文件本身。有关示例,请参见。脚本的相关部分将符号链接属性存储在zipinfo中: z

我有一个脚本,可以创建包含符号链接的dir的zip文件。我 我惊讶地发现拉链已经拉上了目标的拉链 链接,而不是链接本身,这是我想要的和
预期。有人知道如何让zipfile压缩链接吗?

似乎不支持存储符号链接。将它们存储在ZIP中的方式实际上不是格式的一部分。特别是,InfoZip的实现支持它们,因此您可以。请确保您的解压软件能够处理此类存档—正如我所说,此功能不是标准化的。

可以使用zipfile存储符号链接,而不是文件本身。有关示例,请参见。脚本的相关部分将符号链接属性存储在zipinfo中:

zipInfo = zipfile.ZipInfo(archiveRoot)
zipInfo.create_system = 3
# long type of hex val of '0xA1ED0000L',
# say, symlink attr magic...
zipInfo.external_attr = 2716663808L
zipOut.writestr(zipInfo, os.readlink(fullPath))

我在Zip支持类中定义了以下方法

def add_symlink(self, link, target, permissions=0o777):
    self.log('Adding a symlink: {} => {}'.format(link, target))
    permissions |= 0xA000

    zi = zipfile.ZipInfo(link)
    zi.create_system = 3
    zi.external_attr = permissions << 16
    self.zip.writestr(zi, target)
def add_symlink(自身、链接、目标、权限=0o777):
log('添加符号链接:{}=>{}'。格式(链接,目标))
权限|=0xA000
zi=zipfile.ZipInfo(链接)
zi.create_system=3

zi.external\u attr=permissions请找到一个完整的Python代码作为工作示例,该代码使用指向
/proc/cpuinfo
的符号链接
cpuinfo.txt
创建
cpuinfo.zip
存档

#!/usr/bin/python

import stat
import zipfile

def create_zip_with_symlink(output_zip_filename, link_source, link_target):
    zipInfo  = zipfile.ZipInfo(link_source)
    zipInfo.create_system = 3 # System which created ZIP archive, 3 = Unix; 0 = Windows
    unix_st_mode = stat.S_IFLNK | stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH
    zipInfo.external_attr = unix_st_mode << 16 # The Python zipfile module accepts the 16-bit "Mode" field (that stores st_mode field from struct stat, containing user/group/other permissions, setuid/setgid and symlink info, etc) of the ASi extra block for Unix as bits 16-31 of the external_attr
    zipOut = zipfile.ZipFile(output_zip_filename, 'w', compression=zipfile.ZIP_DEFLATED)
    zipOut.writestr(zipInfo, link_target)
    zipOut.close()

create_zip_with_symlink('cpuinfo.zip', 'cpuinfo.txt', '/proc/cpuinfo')

谢谢最后,我派生了一个子进程来使用命令行zip和--symlinks。它比python zipfile库慢得多,但它确实支持符号链接。@LarryMartell Info-ZIP有一个共享库和一个独立的可执行文件,可以为您节省一些周期。但是我找不到任何相关文档。python3不区分long和int,因此
zipInfo.external\u attr=0xA1ED0000L
应该可以工作(哪一个更可读?)我看到了更好的实现:
zipInfo.external\u attr|=0xa000000
unzip cpuinfo.zip
ls -l cpuinfo.txt
cat cpuinfo.txt