使用python在内存中的zipfile中创建符号链接

使用python在内存中的zipfile中创建符号链接,python,memory,symlink,zipfile,Python,Memory,Symlink,Zipfile,我正在寻找一种在内存中创建zipfile并在zipfile中包含符号链接的方法。 到目前为止,我已找到此代码并尝试以下代码: from zipfile import ZipInfo from zipfile import ZipFile from zipfile import ZIP_DEFLATED, ZIP_STORED from cStringIO import StringIO import codecs buf = StringIO() zipfile = ZipFile( buf

我正在寻找一种在内存中创建zipfile并在zipfile中包含符号链接的方法。 到目前为止,我已找到此代码并尝试以下代码:

from zipfile import ZipInfo
from zipfile import ZipFile
from zipfile import ZIP_DEFLATED, ZIP_STORED
from cStringIO import StringIO
import codecs


buf = StringIO()
zipfile = ZipFile( buf,'w')

zipinfo = ZipInfo()
zipinfo.filename = u'bundle/'
zipinfo.compress_type = ZIP_STORED
zipinfo.external_attr = 040755 << 16L # permissions drwxr-xr-x
zipinfo.external_attr |= 0x10 # MS-DOS directory flag
zipfile.writestr(zipinfo, '')


path = u'bundle/test.txt'
zipinfo = ZipInfo(path)
zipinfo.compress_type = ZIP_DEFLATED
zipinfo.external_attr = 0644 << 16L # permissions -r-wr--r--
zipfile.writestr(zipinfo, u'Test content')

dest = path

#create symbolic link (success)
zipinfo = ZipInfo()
zipinfo.filename = u'test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)


#create symbolic link (failed)
zipinfo = ZipInfo()
zipinfo.filename = u'bundle1/test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)

for info in zipfile.infolist():
    print u'filename %s' %info.filename
    print u'external_attr %s' %info.external_attr
    print u'header_offset %s' %info.header_offset
    print u'file_size %s' %info.file_size
    print u'crc %s' %info.CRC 
    print u'\n\n'


zipfile.close()
buf.reset()
with codecs.open('test.zip', 'w') as f:
    f.write(buf.getvalue())
buf.close()
从zipfile导入ZipInfo
从zipfile导入zipfile
从zipfile导入压缩包,压缩包存储
从cStringIO导入StringIO
导入编解码器
buf=StringIO()
zipfile=zipfile(buf,'w')
zipinfo=zipinfo()
zipinfo.filename=u'bundle/'
zipinfo.compress_type=ZIP_存储

zipinfo.external_attr=040755如果在
bundle1
中创建指向
bundle/test.txt
的符号链接,则目标必须位于
bundle1/bundle/test.txt
中。符号链接总是相对于它们自己的路径(当然,除非它们以
/
开头)


因此,为了实现这一点,您需要将链接目的地更改为
。/bundle/test.txt

谢谢!我发现我需要检查源路径和目标路径之间的公共前缀,然后使用相对路径创建符号链接。@mata:是否有windows特定的内容?我正在尝试使用相同的技术创建符号链接,但它不起作用。