1

zc.buildout で管理されている Pyramid Web アプリケーションがあります。その中で、buildout ディレクトリのサブディレクトリにあるディスク上のファイルを読み取る必要があります。

問題は、ファイルへのパスを決定することです-絶対パスをハードコーディングしたくありません.本番環境でアプリを提供する場合、相対パスを指定するだけでは機能しません(おそらく作業ディレクトリが異なるため)。

したがって、私が考えている有望な「フック」は次のとおりです。

  • 「ルート」ビルドアウト ディレクトリ。buildout.cfg で指定${buildout:directory}できますが、Python コードからアクセスできるように「エクスポート」する方法がわかりません。

  • アプリを起動する Paster の .ini ファイルの場所

4

3 に答える 3

5

@MartijnPieters が自分の回答に対するコメントで示唆しているように、collective.recipe.templateを使用して.ini. 自分のプロジェクトでそのデータにアクセスするにはどうすればよいか考えたので、解決しました:-)

必要なものまでさかのぼって作業しましょう。まず、ビルドアウト ディレクトリが必要なビュー コードで:

def your_view(request):
    buildout_dir = request.registry.settings['buildout_dir']
    ....

request.registry.settings(ドキュメントを参照) は、「辞書のような配置設定オブジェクト」です。展開設定を参照してください。これは、次の**settingsようなメイン メソッドに渡されるものです。def main(global_config, **settings)

これらの設定は、またはファイルの[app:main]一部にあるものです。そこに buildout ディレクトリを追加します。deployment.iniproduction.ini

[app:main]
use = egg:your_app

buildout_dir = /home/you/wherever/it/is

pyramid.reload_templates = true
pyramid.debug_authorization = false
...

しかし、これが最後のステップなので、ハードコードされたパスをそこに入れたくはありません。したがって、テンプレートを使用して .ini を生成します。テンプレートdevelopment.ini.in${partname:variable}拡張言語を使用します。あなたの場合、必要なもの${buildout:directory}

[app:main]
use = egg:your_app

buildout_dir = ${buildout:dir}
#              ^^^^^^^^^^^^^^^

pyramid.reload_templates = true
pyramid.debug_authorization = false
...

buildout.cfgから生成するビルドアウト パーツを追加development.inidevelopment.ini.inます。

[buildout]
...
parts =
    ...
    inifile
    ...

[inifile]
recipe = collective.recipe.template
input = ${buildout:directory}/development.ini.in
output = ${buildout:directory}/development.ini

Collective.recipe.template を使用すると、あらゆる種類のクールなことを実行できることに注意してください。たとえば、と で${serverconfig:portnumber}一致するポート番号を生成します。楽しむ!production.iniyour_site_name.nginx.conf

于 2013-01-07T08:31:15.473 に答える
2

ビルドアウト ルートまたは paster.ini の場所に関連するファイルへのパスが常に同じである場合、それはあなたの質問からのようですが、paster.ini で設定できます。

[app:main]
...
config_file = %(here)s/path/to/file.txt

次に、Reinout の回答のように、レジストリからアクセスします。

def your_view(request):
    config_file = request.registry.settings['config_file']
于 2013-01-07T15:34:55.580 に答える
0

これが私が考案したかなり不器用な解決策です:

のオプションbuildout.cfgを使用して、buildout ディレクトリを次の場所に追加しました。extra-pathszc.recipe.eggsys.path

....
[webserver]
recipe = zc.recipe.egg:scripts
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}

app_config.py次に、buildout ディレクトリに呼び出されたファイルを配置します。

# This remembers the root of the installation (similar to {buildout:directory}
# so we can import it and use where we need access to the filesystem.
# Note: we could use os.getcwd() for that but it feels kinda wonky
# This is not directly related to Celery, we may want to move it somewhere
import os.path
INSTALLATION_ROOT = os.path.dirname(__file__)

これで、Python コードにインポートできます。

from app_config import INSTALLATION_ROOT
filename = os.path.join(INSTALLATION_ROOT, "somefile.ext")
do_stuff_with_file(filename)

誰かがより良い解決策を知っていれば、大歓迎です:)

于 2013-01-05T00:43:25.443 に答える