distutils / setuptoolsの前後のデータファイルへのアクセス
-
10-07-2019 - |
質問
プラットフォームに依存しないPyQtアプリケーションを実行しています。 setuptoolsを使用してsetup.pyファイルを作成します。これまでのところ、プラットフォームをデテックすることができました。 Windowsでpy2exeを使用するためにプラットフォームに応じてsetup()の特定のオプションをロードするなど...
ただし、私のアプリケーションでは、いくつかのテーマ、HTML、および画像を配布しています。これらの画像を実行時にアプリケーションに読み込む必要があります。これまでのところ、それらはアプリケーションのthemes /ディレクトリに保存されています。
setuptoolsとdistutilsのドキュメントを読んでおり、setup()にdata_filesオプションを指定した場合、themes /ディレクトリ内のすべてのファイルが" share / MyApp / themes /"にインストールされることがわかりました。 / usr /接頭辞、またはプラットフォーム上のsys.prefixでインストールされます。 os.path.join(sys.prefix、" share&quot ;," MyApp&quot ;," themes")を使用してデータファイルを検索すると仮定します。どのプラットフォームを使用しているのでしょうか?
ただし、開発中のデータファイルにもアクセスできるようにしたいので、データソースはアプリケーションソースに対してthemes /ディレクトリにあります。どうすればいいですか? アプリケーションがインストールされているかどうかを判断するスマートな方法はありますか?または、現在どこにいてもデータファイルにマップするユーティリティですか?
ソースに関連するテーマがあるか、sys.prefix / share ...などにあるかどうかを確認するために、あらゆる種類のいハックを追加するのは本当に嫌いです。開発中にデータファイルを見つける方法を教えてください。そして、任意のプラットフォームにインストールした後ですか?
解決
data_fileというユーティリティメソッドを使用しました:
def data_file(fname):
"""Return the path to a data file of ours."""
return os.path.join(os.path.split(__file__)[0], fname)
これをプロジェクトの init .pyファイルに入れ、パッケージ内のどこからでも呼び出して、パッケージに関連するファイルを取得します。
Setuptoolsは同様の機能を提供しますが、これにはsetuptoolsは必要ありません。
他のヒント
my_data = pkg_resources.resource_string(__name__, fname)
pkgutil / pkg_resourcesモジュールを使用してデータファイルをロードする 。 zip形式の卵の中からでも動作します。