7

リモート マシンで関数を簡単に実行できるようにするコンストラクトを Python 3 で作成しようとしています。リモートサーバーで実行されている、受信した関数を実行するpython tcpサーバーが既にあると仮定すると、現在、次のようなデコレーターの使用を検討しています

@execute_on(address, port)

これにより、装飾している関数を実行するために必要なコンテキストが作成され、関数とコンテキストがリモート マシンの tcp サーバーに送信されて実行されます。まず、これはやや正気ですか?そうでない場合は、より良いアプローチをお勧めできますか? グーグルで調べましたが、これらのニーズを満たすものは見つかりませんでした。

私は tcp サーバーとクライアントのための迅速で汚い実装を持っているので、それがうまくいくことはかなり確信しています。デコレータに渡される関数 (func など) の文字列表現を取得できます。

import inspect
string = inspect.getsource(func)

その後、サーバーに送信して実行することができます。問題は、関数の実行に必要なすべてのコンテキスト情報を取得するにはどうすればよいかということです。たとえば、 func が次のように定義されている場合、

import MyModule
def func():
    result = MyModule.my_func()

MyModule は、リモート サーバー上のグローバル コンテキストまたは funcs ローカル コンテキストのいずれかで func を使用できる必要があります。この場合、それは比較的些細なことですが、import ステートメントがいつ、どのように使用されるかによって、非常に複雑になる可能性があります。Pythonでこれを行う簡単でエレガントな方法はありますか? 現時点で私が思いついた最善の方法は、ast ライブラリを使用してすべてのインポート ステートメントを引き出し、inspect モジュールを使用してそれらのモジュールの文字列表現を取得し、リモート サーバー上でコンテキスト全体を再構築することです。特にエレガントではなく、エラーの余地がたくさんあります。

御時間ありがとうございます

4

5 に答える 5

3

execnetプロジェクトに興味があるかもしれません。

execnetは、バージョン、プラットフォーム、およびネットワークの障壁を越えてPythonインタープリターと簡単に対話するための慎重にテストされた手段を提供します。次の用途を対象とした最小限の高速APIがあります。

  • ローカルまたはリモートのCPUにタスクを分散する
  • ハイブリッドマルチプロセスアプリケーションの作成とデプロイ
  • 多数のexec環境を管理するためのスクリプトを作成する

http://codespeak.net/execnet/example/test_info.html#get-information-from-remote-ssh-account

私はそれのデモを見ました。しかし、それを自分で使用したことはありません。

于 2010-06-03T04:49:22.160 に答える
3

リモートサーバーが何らかの形で非常に強力に保護されているか、「非常にサンドボックス化」されていない限り(BSDの「刑務所」など)、あなたが概説するアプローチは非常に危険です-関数を送信できる人は誰でもそこで任意のコードを実行できます。

完全に信頼できる認証システムがあると仮定すると、「脆弱性」の問題が発生することに気付きました-関数は、実行時にモジュールで定義されたグローバルに依存する可能性があります(これは、検査で検出できるものとは異なる場合があります) : 実行時に、インポートされたモジュールのセット、より一般的にはグローバルのセットを決定することは、チューリング完全問題です)。

リモート実行のために関数を送信するときに、関数のグローバルと関数自体をシリアル化することで、グローバルの問題に対処できます(これらすべてを読み取り可能な文字列形式でシリアル化するか、そうでないかは小さな問題です)。 . ただし、それでも関数内で実行されるインポートの問題が残ります。

「リモート」関数に「関数内にインポートを行わない (および関数から呼び出される関数)」などの制限を設けたくない場合を除き、サーバーをオーバーライドすることができると思います__import__(組み込み関数すべてのインポートステートメントで使用され、あなたのような特定のニーズに合わせてオーバーライドされるように設計されています;-) 送信側クライアントから追加のモジュールを要求します (もちろん、そのクライアントには「サーバーのような」機能も必要です)。サーバーからのそのような「モジュール要求」に応答できなければならないという点で)。

このタスクを正気の領域に戻すために、リモート化された機能にいくつかの制限を課すことはできませんか?

于 2010-06-03T00:30:51.320 に答える
1

この方法で問題を解決するためのシステムの制限/要件があるかどうかは、あなたの質問からは明らかではありません。そうでない場合は、何らかのメッセージング インフラストラクチャを使用して、これを行うためのはるかに簡単で迅速な方法があるかもしれません。

たとえば、[セロリ][1]

[1]: http://ask.github.com/celery/getting-started/introduction.html はあなたのニーズを満たします。

于 2010-06-03T08:06:05.900 に答える
0

これであなたの最終目標は何ですか?あなたの説明から、単純なメッセージングクラスを作成してそのインスタンスを送信して、リモートマシンに「何か」を実行するように命令できない理由がわかりません..?

何をするにしても、リモート マシンは Python ソースを実行する必要があるため、そこにコードを配布して実行してみませんか? いくつかの Python ソース ファイルを受け入れる単純なサーバーを作成し、それらを抽出して関連モジュールをインポートし、コマンドを実行できますか?

于 2010-06-03T00:28:08.063 に答える
0

これを行うのはおそらく難しく、セキュリティや引数などの問題に遭遇するでしょう。おそらく、関数ごとに実行するのではなく、ソケットまたは HTTP サービスを使用してコードを与えることができる Python インタープリターをリモートで実行することができます。レベル?

于 2010-06-03T05:16:01.060 に答える