python: могут ли исполняемые zip-файлы включать файлы данных? - PullRequest
20 голосов
/ 18 марта 2011

Будучи довольно новым для python, я только недавно обнаружил возможность непосредственного выполнения файла .zip, поместив файл __main__.py в верхней части файла.Это прекрасно работает для кода Python, но могу ли я связать другие типы файлов и получить к ним доступ с помощью моих скриптов?Если да, то как?

Моей конечной целью было бы объединить несколько файлов изображений вместе с кодом Python в один файл .zip, а затем иметь возможность использовать эти изображения в приложении без необходимости извлекать их на диск.,Я также хотел бы объединить уведомление об авторских правах, заметки о выпуске и т. Д., Чтобы все приложение и его файлы данных были в одном zip-файле, который можно было выполнить без необходимости извлекать его куда-либо.

Ответы [ 4 ]

16 голосов
/ 18 марта 2011

Вы можете использовать pkg_resources функции для доступа к файлам:

# __main__.py
import pkg_resources
from PIL import Image

print pkg_resources.resource_string(__name__, 'README.txt')

im = Image.open(pkg_resources.resource_stream('app', 'im.png'))
im.rotate(45).show()

Где zipfile содержит:

.
|-- app
|   |-- im.png
|   `-- __init__.py
|-- README.txt
`-- __main__.py

Чтобы сделать исполняемый файл zipfile, выполните:

$ echo '#!/usr/bin/env python' | cat - zipfile > program-name
$ chmod +x program-name

Чтобы проверить это:

$ cp program-name /another-dir/
$ cd /another-dir && ./program-name
5 голосов
/ 18 марта 2011

просто используйте pkgutil.get_data () , как предложено в в этом ответе

5 голосов
/ 18 марта 2011

По крайней мере, на моем компьютере с Linux нет открытого дескриптора файла или отображенной памяти процесса в его собственный zip-файл, поэтому, по-видимому, нет никакого способа «волшебного» доступа к нему.это не так сложно.Создайте __main__.py примерно так:

import os, zipfile

me = zipfile.ZipFile(os.path.dirname(__file__), 'r')
f = me.open('other.txt')
print f.read()
f.close()
me.close()

Редактировать: В некоторой степени это.Для полноты:

$ echo "Hello ZIP" > other.txt
$ zip testo.zip __main__.py other.txt
$ python testo.zip
Hello ZIP
0 голосов
/ 18 марта 2011

pkgutil.get_data(package, resource) принимает имя пакета и ресурс.Это означает, что вы должны поместить свои файлы данных в пакет внутри zip-файла.

Так, например, zip-файл, содержащий:

__main__.py
zippeddata/__init__.py
zippeddata/data.txt

Файл __init__.py может быть пустым или простокомментарий, но вам нужен один, чтобы сделать zippeddata импортируемым.

Затем в __main__.py вы просто позвоните:

data = pkgutil.get_data('zippeddata', 'data.txt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...