10

library.zip にファイルを追加する解決策を見つけました: Extend py2exe to copy files to the zipfile where pkg_resources can load them .

library.zip に exe が含まれていない場合、ファイルにアクセスできます。

ファイルを追加します:text.txt ディレクトリに:library.zip の foo/media。そして、私はこのコードを使用します:

import pkg_resources
import zipfile
from cStringIO import StringIO

my_data = pkg_resources.resource_string(__name__,"library.zip")

filezip = StringIO(my_data)
zip = zipfile.ZipFile(filezip)
data = zip.read("foo/media/text.txt")

pkg_resources を使ってみたのですが、「library.zip」を直接開くことができたので、何かわからないと思います。

私の質問は、library.zip が exe に埋め込まれている場合、どうすればこれを行うことができますか?

よろしくお願いします

ジャン・ミシェル

4

3 に答える 3

10

私はこれに対するかなりきちんとした解決策をまとめましたが、pkg_resources を使用していません。

生産性向上ツールをスタンドアロン EXE として配布する必要があります。つまり、すべてが 1 つの .exe ファイルにバンドルされています。また、これらのツールが使用されたときに通知を送信する必要があります。これは、ファイルベースの構成を使用して、Logging API を介して行います。これらの通知を効果的にオフにするのを難しくするために、logging.cfg ファイルを埋め込みました。

したがって、以下は私の setup.py の興味深い部分です。

LOGGING_CFG = open('main/resources/logging.cfg').read()

setup(
    name='productivity-tool',
    ...

    # py2exe extras
    console=[{'script': productivity_tool.__file__.replace('.pyc', '.py'),
              'other_resources': [(u'LOGGINGCFG', 1, LOGGING_CFG)]}],
    zipfile=None,
    options={'py2exe': {'bundle_files': 1, 'dll_excludes': ['w9xpopen.exe']}},
)

次に、productivity_tool.py のスタートアップ コードで:

from win32api import LoadResource
from StringIO import StringIO
from logging.config import fileConfig
...

if __name__ == '__main__':
    if is_exe():
        logging_cfg = StringIO(LoadResource(0, u'LOGGINGCFG', 1))
    else:
        logging_cfg = 'main/resources/logging.cfg'
    fileConfig(logging_cfg)
    ...

御馳走になります!!!

于 2010-09-10T16:22:15.487 に答える
1

ありがとう、しかし私は解決策を見つけました

my_data = pkg_resources.resource_stream("__main__",sys.executable) # get lib.zip file
zip = zipfile.ZipFile(my_data)
data = zip.read("foo/media/doc.pdf") # get my data on lib.zip
file = open(output_name, 'wb')
file.write(data) # write it on a file
file.close()

よろしくお願いします

于 2010-03-11T10:51:08.667 に答える
0

library.zip ファイルを取得するために pkg_resources を使用しないでください。これを使用して、追加されたリソースを取得する必要があります。

次のプロジェクト構造があるとします。

setup.py
foo/
    __init__.py
    bar.py
    media/
        image.jpg

image.jpg にアクセスするには、resource_string (または、できれば resource_stream) を使用します。

img = pkg_resources.resource_string(__name__, 'media/image.jpg')

それは「うまくいく」はずです。少なくとも、メディア ファイルを EXE にバンドルしたときはそうでした。(申し訳ありませんが、私は py2exe を使用していた会社を退職したため、実際に使用できる例はありません。)

pkg_resources.resource_filename() を使用することもできますが、py2exe では機能しないと思います。

于 2010-01-15T16:15:01.067 に答える