質問

Web2pyは非常に優れているので、Web2pyを使用したいのです。作業ディレクトリをすべてのモジュール/ライブラリ/アプリがあるディレクトリに変更するだけで、使用できるようにする必要があります。 Web2pyインターフェイス/アプリケーションを使用するときに、実際のプログラムをインポートできるようになりたいです。すべてのアプリやものをWeb2pyフォルダー内に配置する代わりに、これを行う必要があります...プログラムをWeb2pyフォルダーに入れずにプログラムにWebフロントエンドを提供しようとしています。これが理解しにくい場合は申し訳ありません。

役に立ちましたか?

解決

os.chdir OSのワーキングディレクトリを変更しますが、目的のために(奇妙な場所に住むように制約されているモジュールとCの束のインポートを有効にする)、必要なディレクトリを追加する方が良いようです。 sys.path 代わりは。

他のヒント

マルチスレッドPythonプログラム(Pythonだけでなく)では、OS.Chdirを使用しないでください。複数のスレッドを実行している場合は、Sys.Pathを変更しないでください。他のスレッドに影響を与えるため、安全ではありません。さらに、爆発する可能性があるため、ループでsys.path.append()をsys.path.append()はしないでください。

すべてのWebフレームワークはマルチスレッドされており、リクエストはループで実行されます。一部のWebフレームワークでは、Webサーバーを再起動せずにアプリケーションをインストール/アンインストールすることはできません。したがって、os.chdir/sys.path.appendが起動時にのみ実行される場合、問題はありません。

Web2pyでは、Webサーバーを再起動せずにアプリケーションをインストール/アンインストールできるようにする必要があります。アプリを非常に動的にしたい(たとえば、HTTPリクエストで提供された情報に基づいてモデルを定義します)。各アプリに独自のモデルフォルダーが必要になり、2つのアプリが同じモジュールの異なるバージョンを必要とする場合、それらが互いに競合しないようにするため、アプリ間の完全な分離を望みます。 、local_import)。

通常のos.chdirとsys.path.appendを使用することもできますが、スレッド外でそれを行う必要があります(これはWeb2py特定の問題ではありません)。他のPythonプログラムのように、好きな場所にインポートを使用できます。

このディスカッションをWeb2pyメーリングリストに移動することを強くお勧めします。

私はこれをやらなければなりませんでした。コントローラーから使用したいモジュールはほとんどありません。コントローラーのモジュールディレクトリにあるコードを使用できるようにする場合は、以下を使用できます。

# 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

ジェイ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top