在tgz文件上运行pythonsubprocess.call以卸载并流式输出



我在命令行中使用子进程调用来取消标记文件,我需要使用该调用的输出流到临时文件中,这样我就可以读取tgz文件中"+contents"文件夹的内容。

我失败的输出是:

/streamContents.pyrsh:ftp:没有与主机名关联的地址tar(child):ftp://myftpserver.com/pkgsrc/doxygen_pkgs/test.tgz:无法打开:输入/输出错误tar(child):错误不可恢复:现在退出

gzip:sdin:意外的文件结尾tar:子级返回状态2tar:错误退出比以前的错误延迟追踪(最近一次通话):文件"./streamContents.py",第29行,instream=proc.stdout.read(8196)AttributeError:"int"对象没有属性"stdout"

#!/usr/bin/python
from io import BytesIO
import urllib2
import tarfile
import ftplib
import socket
import threading
import subprocess
tarfile_url = "ftp://myftpserver.com/pkgsrc/doxygen_pkgs/test.tg
z"
try:
    ftpstream = urllib2.urlopen(tarfile_url)
except URLerror, e:
    print "URL timeout"
except socket.timeout:
    print "Socket timeout"

# BytesIO creates an in-memory temporary file.
tmpfile = BytesIO()
last_size = 0
tfile_extract = ""
while True:
    proc = subprocess.call(['tar','-xzvf', tarfile_url], stdout=subprocess.PIPE)
    # Download a piece of the file from the ftp connection
    stream = proc.stdout.read(8196)
    if not stream: break
    tmpfile.write(bytes(stream))
    # Seeking back to the beginning of the temporary file.
    tmpfile.seek(0)
    # r|gz forbids seeking backward; r:gz allows seeking backward
    try:
       tfile = tarfile.open(fileobj=tmpfile, mode="r:gz")
       print tfile.extractfile("+CONTENTS")
       tfile_extract_text = tfile_extract.read()
       print tfile_extract.tell()
       tfile.close()
       if tfile_extract.tell() > 0 and tfile_extract.tell() == last_size:
          print tfile_extract_text
          break
       else:
          last_size = tfile_extract.tell()
    except Exception:
       tfile.close()
       pass

tfile_extract_text = tfile_extract.read()
print tfile_extract_text
# When you're done:
tfile.close()
tmpfile.close()

根据我上面的评论,您需要使用urllib2tempfile将tar文件下载到一个临时文件,然后使用tarfile打开这个临时文件。

以下是一些入门代码:

import urllib2
import tarfile
from tempfile import TemporaryFile
f_url = 'url_of_your_tar_archive'
ftpstream = urllib2.urlopen(f_url)
tmpfile = TemporaryFile()
# Download contents of tar to a temporary file
while True:
    s = ftpstream.read(16384)
    if not s:
        break
    tmpfile.write(s)
ftpstream.close()
# Access the temporary file to extract the file you need
tmpfile.seek(0)
tfile = tarfile.open(fileobj=tmpfile, mode='r:gz')
print tfile.getnames()
contents = tfile.extractfile("+CONTENTS").read()
print contents

相关内容

  • 没有找到相关文章

最新更新