Запустить файл внутри zip-файла?

Можно ли запустить, например, .html или .exe внутри zip-файла? Я использую модуль Zipfile.

Вот мой пример кода:

import zipfile

z = zipfile.ZipFile("c:\\test\\test.zip", "r")
x = ""
g = ""
for filename in z.namelist():
    #print filename
    y = len(filename)
    x = str(filename)[y - 5:]
    if x == ".html":
        g = filename
f = z.open(g)

После f = z.open(g) я не знаю, что делать дальше. Я пытался использовать .read(), но он читает только то, что находится внутри html, мне нужно, чтобы он запускался или выполнялся.

Или есть другие подобные способы сделать это?


person Katherina    schedule 19.01.2012    source источник
comment
Я не уверен, что поведение, которое вы хотите, поэтому трудно помочь вам добиться этого. Уберите zip-файл из уравнения. Представьте, что у вас есть простой файл .html, например. g = "testfile.html". Какое поведение вы хотите видеть от компьютера?   -  person Jim DeLaHunt    schedule 19.01.2012
comment
я бы хотел, чтобы он запускал testfile.html в веб-браузере. например, после g = testfile.html есть код, который откроет его в веб-браузере. (но testfile.html находится внутри zip-файла)   -  person Katherina    schedule 19.01.2012
comment
Я предлагаю вам добавить к вашему вопросу код для открытия файла в веб-браузере, запуска исполняемого файла и т. д., который вы бы использовали, если бы файл был вне zip-файла. Вы уже знаете, как сделать эту часть?   -  person Jim DeLaHunt    schedule 19.01.2012
comment
Я получил код для запуска его вне zip-файла, проблема в том, как мне его запустить, если он находится внутри zip-файла, я хочу заново создать его, если вы откроете zip-файл и дважды щелкните html-файл внутри zip-файла. он автоматически откроется в веб-браузере. это под окнами кстати   -  person Katherina    schedule 19.01.2012
comment
Вы получили код запуска вне zip-файла. Хороший. Что произойдет, если вы дадите дескриптор файла f из z.open(g) этому коду? Что не работает? Что ведет себя по-другому? Будет полезно, если вы покажете нам этот код.   -  person Jim DeLaHunt    schedule 19.01.2012


Ответы (2)


Лучшим подходом будет извлечь требуемый файл во временный каталог Windows и выполнить его. Я изменил ваш исходный код, чтобы создать временный файл и выполнить его:

import zipfile
import shutil
import os

z = zipfile.ZipFile("c:\\test\\test.zip", "r")
x = ""
g = ""
basename = ""
for filename in z.namelist():
    print filename
    y = len(filename)
    x = str(filename)[y - 5:]
    if x == ".html":
        basename = os.path.basename(filename) #get the file name and extension from the return path
        g = filename
        print basename
        break #found what was needed, no need to run the loop again
f = z.open(g)

temp = os.path.join(os.environ['temp'], basename) #create temp file name
tempfile = open(temp, "wb")
shutil.copyfileobj(f, tempfile) #copy unzipped file to Windows 'temp' folder
tempfile.close()
f.close()
os.system(temp) #run the file
person Abbas    schedule 20.01.2012
comment
Не используйте os.system() используйте os.startfile() в Windows; subprocess, webbrowser модули на других ОС. - person jfs; 20.01.2012
comment
tempfile более надежен, чем os.environ['temp'] - person jfs; 20.01.2012
comment
вы можете использовать os.path.splitext() для извлечения расширения файла или просто filename.endswith('.html') для его проверки, например, см. мой ответ. - person jfs; 20.01.2012
comment
привет спасибо за обучение позвольте мне изучить его снова некоторое время. мне нужно время, чтобы это осело в моей голове =) спасибо, ребята - person Katherina; 24.01.2012

Запустите первый файл .html в zip-архиве, указанном в командной строке:

#!/usr/bin/env python
import os
import shutil
import sys
import tempfile
import webbrowser
import zipfile
from subprocess import check_call
from threading  import Timer

with zipfile.ZipFile(sys.argv[1], 'r') as z:
    # find the first html file in the archive
    member = next(m for m in z.infolist() if m.filename.endswith('.html'))
    # create temporary directory to extract the file to
    tmpdir = tempfile.mkdtemp()
    # remove tmpdir in 5 minutes
    t = Timer(300, shutil.rmtree, args=[tmpdir], kwargs=dict(ignore_errors=True))
    t.start()
    # extract the file
    z.extract(member, path=tmpdir)
    filename = os.path.join(tmpdir, member.filename)

# run the file
if filename.endswith('.exe'):
    check_call([filename]) # run as a program; wait it to complete
else: # open document using default browser
    webbrowser.open_new_tab(filename) #NOTE: returns immediately

Пример

T:\> open-from-zip.py file.zip

В качестве альтернативы webbrowser вы можете использовать os.startfile(os.path.normpath(filename)) в Windows.

person jfs    schedule 20.01.2012
comment
привет спасибо за обучение позвольте мне изучить его снова некоторое время. мне нужно время, чтобы это осело в моей голове =) спасибо, ребята - person Katherina; 24.01.2012