31

Python プログラムでリソースにアクセスする適切な方法は何ですか。

基本的に、私の python モジュールの多くでは、次のようなコードを書くことになります。

  DIRNAME = os.path.split(__file__)[0]

  (...) 

  template_file = os.path.join(DIRNAME, "template.foo")

どちらでも構いませんが:

  • Python zip パッケージを使い始めると壊れます
  • 定型コードです

Java では、まったく同じことを行う関数がありましたが、コードがフォルダーの束にあるときと、.jarファイルにパッケージ化されているときの両方で機能しました。

Pythonにそのような機能はありますか、それとも私が使用する可能性のある他のパターンはありますか?

4

3 に答える 3

20

stdlib のget_dataまたはsetuptools/distributeのpkg_resourcesを使用して確認する必要があります。どちらを使用するかは、コードを卵としてパッケージ化するために既に配布を使用しているかどうかによって異なります。

于 2012-06-07T16:11:51.407 に答える
2

この 2 つの側面をどのように組み合わせることができるかを理解しようとしています。

  1. ネイティブ ファイル システムでのリソースの読み込み
  2. 圧縮ファイルにパッケージ化

zipimport に関する簡単なチュートリアルを読む: http://www.doughellmann.com/PyMOTW/zipimport/

次の例が表示されます。

import sys
sys.path.insert(0, 'zipimport_example.zip')
import os
import zipimport
importer = zipimport.zipimporter('zipimport_example.zip')
module = importer.load_module('example_package')
print module.__file__
print module.__loader__.get_data('example_package/README.txt')

__file__ の出力は「zipimport_example.zip/example_package/__init__.pyc」だと思います

中からの見え方は要チェックです。

しかし、私たちはいつでも次のようなことをすることができます:

if ".zip" in example_package.__file__:
    ... 
    load using get_data
else:
    load by building the correct file path

[編集:] 私は例をもう少し良くしようとしました。

パッケージが圧縮ファイルとしてインポートされると、2 つのことが起こります。

  1. __file__ のパスには「.zip」が含まれています。
  2. __loader__ は名前空間で利用可能です

これら 2 つの条件が満たされている場合、パッケージ内で次のことができます。

print __loader__.get_data(os.path.join('package_name','README.txt'))

それ以外の場合、モジュールは正常にロードされ、通常の方法でファイルをロードできます。

于 2012-06-07T15:57:17.327 に答える
0

zipimport標準の python モジュールが答えになると思います...

編集:モジュールを直接使用するのではなくsys.path、例に示すように使用するのが良い方法です:

  • test.zip私は1つのpythonモジュールtestとファイルtest.fooを含むzipファイルを持っています
  • zip された python モジュールtestが を認識できることをテストするために、次のtest.fooコードが含まれています。

c

import os
DIRNAME = os.path.dirname(__file__)
if os.path.exists(os.path.join(DIRNAME, 'test.foo')):
    print 'OK'
else:
    print 'KO'

テストは問題ないようです:

>>> import sys
>>> sys.path.insert(0, r'D:\DATA\FP12210\My Documents\Outils\SVN\05_impl\2_tools\test.zip')
>>> import test
OK
>>> 

したがって、解決策は、zip ファイルをループしてすべての python モジュールを取得し、それらをsys.path;に追加することです。このコードは、アプリケーションによって最初に読み込まれるのが理想的です。

于 2012-06-07T15:48:25.333 に答える