WEb2Py はかなりいいので使いたいです。作業ディレクトリを、すべてのモジュール/ライブラリ/アプリがあるディレクトリに変更して、それらを使用できるようにするだけです。web2py インターフェイス/アプリケーションを使用するときに、実際のプログラムをインポートできるようにしたいと考えています。すべてのアプリやものを Web2Py フォルダー内に配置する代わりに、これを行う必要があります...プログラムを Web2Py フォルダーに配置せずに、プログラムに Web フロントエンドを提供しようとしています..これが理解しにくい場合は申し訳ありません。
3 に答える
マルチスレッドの Python プログラム (Python だけでなく) では、os.chdir を使用しないでください。複数のスレッドを実行している場合は、sys.path を変更しないでください。他のスレッドに影響を与えるため、安全ではありません。さらに、爆発する可能性があるため、ループ内で sys.path.append() を使用しないでください。
すべての Web フレームワークはマルチスレッドであり、リクエストはループで実行されます。一部の Web フレームワークでは、Web サーバーを再起動せずにアプリケーションをインストール/アンインストールできないため、os.chdir/sys.path.append が起動時にのみ実行される場合は問題ありません。
web2py では、Web サーバーを再起動せずにアプリケーションをインストール/アンインストールできるようにしたいと考えています。私たちはアプリを非常に動的なものにしたいと考えています (たとえば、http リクエストで提供される情報に基づいてモデルを定義するなど)。各アプリに独自のモデル フォルダーを用意し、アプリを完全に分離して、2 つのアプリが同じモジュールの異なるバージョンを使用する必要がある場合に競合しないようにするため、そのための API を提供します (request.folder 、local_import)。
通常の os.chdir と sys.path.append を引き続き使用できますが、スレッドの外で行う必要があります (これは web2py 固有の問題ではありません)。import は、他の Python プログラムと同じように、好きな場所で使用できます。
この議論を web2py メーリング リストに移動することを強くお勧めします。
私はまさにこれをしなければなりませんでした。コントローラーから使用したいモジュールがいくつかあります。コントローラーの modules ディレクトリにあるコードを使用できるようにしたい場合は、次を使用できます。
# use this in your controller code
impname = local_import('module_in_modules', reload=True)
# reload true will ensure that it will re load whenever
# there are changes to the module
ジェイ