1

py特定のモジュールのファイルのファイルシステム上の場所を実行時に確実に検出するための最良の方法を見つけようとしています。クリーンさとメンテナンスのしやすさのために、いくつかのメソッド(この場合、インターフェイスがモジュールで定義されているサービス呼び出しからの応答の検証に使用されるスキーマ)に関するいくつかの構成データを外部化することを計画しているため、これを行う必要があります。

システムの簡略化された図:

package
|
|-service.py
|
|-call1.scm
|
|-call2.scm

service.py(_call()基本クラスのメソッドですが、質問とは関係ありません)

class FooServ(AbstractService):
    def call1(*args):
        result = self._call('/relative/uri/call1', *args)
        # additional call specific processing
        return result
    def call2(*args):
        result = self._call('/relative/uri/call2', *args)
        # additional call specific processing
        return result

call1.scmとcall2.scmは、応答スキーマを定義します(現在の場合、ドラフトJSONスキーマ形式を使用しますが、質問とは無関係です)

service.pyコードベースの別の場所で、サービス呼び出しが実際に行われるときに、ファイル構造をトラバースしてscmファイルを見つけることができるようにの場所を検出できるようにしたいと思います。少なくとも私のシステムでは、これでうまくいくと思います。

# I realize this is contrived here, but in my code, the method is accessed this way
method = FooServ().call1
module_path = sys.modules[method.__self__.__class__.__module__].__file__
schema_path = os.path.join(os.path.dirname(module_path), method.__name__ + '.scm')

ただし、これがすべてのプラットフォームとインストール構成で安全であることを確認したかったので、調査中にこれに遭遇したため、この方法でこれを実行しようとすると確実に機能しないのではないかと心配しました。__file__これは普遍的に機能しますか、それともモジュールオブジェクトでファイルの場所が返されるという事実は、pycファイルの横以外の場所にある可能性があり、pyこのソリューションを無効にしますか?効果がなくなる場合は、代わりに何ができますか?

4

1 に答える 1

1

リンクするPEPには、次のように書かれています:

Python 3 では、モジュールをインポートすると、その __file__ 属性がソースの py ファイルを指します (Python 2 では、pyc ファイルを指します)。

したがって、Python 3 では常にファイル__file__を指すので問題ありません。Python 2 ではファイルを.py指している可能性がありますが、それは Python 2のファイルと同じディレクトリにあるだけです。.pyc.pyc.py


さて、あなたはこのビットについて言及していると思います:

これらのディストリビューションは pyc ファイルを共有できないため、ソース コードを共有しながら、結果の pyc ファイルを非共有の場所に配置する精巧なメカニズムが開発されました。例には、シンボリックリンクベースの Debian 体制 python-support [8] および python-central [9] が含まれます。これらのアプローチは、Python アプリケーションを幅広いユーザーに配信するための、はるかに複雑で、壊れやすく、不可解で、断片化されたポリシーになります。

これらのメカニズムは、ディストリビューションによってパッケージ化された Python モジュールにのみ適用されると思います。ディストリビューションのパッケージング システムの外で手動でインストールされたモジュールに影響を与えるべきではないと思います。モジュールがメカニズムによって壊れていないことを確認するのは、そのディストリビューション用にモジュールをパッケージ化した人の責任です。

于 2012-12-19T19:35:49.493 に答える