1

私が書いたいくつかの C 関数で Python インタープリターを拡張しようとしています。ドキュメントを読んでから、これらの機能を公開するには、ユーザーは機能を含むモジュールをインポートする必要があります。

ユーザーが入力する必要がないように、C API を介してモジュールをプリロードまたはプリインポートすることは可能import <mymodule>ですか? またはさらに良いfrom <mymodule> import <function>ですか?

編集: PyRun_SimpleString("from mymodule import myfunction") を Py_Initialize(); の直後に実行できます。- これを行う別の方法があるかどうか疑問に思っていました..?

編集 2:つまり、Python インタープリターを組み込んだ C で記述されたアプリケーションがあります。そのアプリケーションは、ユーザーがアプリ用の簡単な Python スクリプトを記述できるように、ユーザーに公開したいいくつかの機能を提供します。私が望むのは、from mymodule import myfunction1, myfunction2非常に特殊なアプリであり、とにかくアプリなしではスクリプトが機能しないため、書く必要をなくすことimport ...だけです。常に要求するのは意味がありません。

4

5 に答える 5

3

Pythonでモジュールを実装する場合でも、ユーザーはimportそれを実行する必要があります。これがPythonの動作方法であり、実際には良いことです。これはPythonの大きな利点の1つです。名前空間/モジュールシステムは堅牢で、使いやすく、理解しやすいものです。

もちろん、アカデミックエクササイズの場合のみ、カスタムインタープリターを作成することで、Python自体に新しい機能を追加できます。この方法で新しいキーワードを作成することもできます。ただし、実用的な目的では、これはお勧めしません。

于 2009-12-26T14:34:34.373 に答える
3

一般的に、いいえ。ただし、ユーザーがインタラクティブ セッションでのみモジュールを使用し、環境変数を設定できる場合は、PYTHONSTARTUP 環境変数をスクリプトに設定して、インタラクティブ セッションの開始時に実行することができます。

私が考えることができる唯一のケースは、あなたとあなたのグループがデータ分析に python を使用しており、特定の問題に対してカスタム コマンドを使用しており、ほとんどのユーザーがプログラマーよりも科学者/統計学者である場合です。ただし、その場合でも、IPython を使用し、 IPython プロファイルを作成してから、ユーザーが実行するエイリアス/スクリプトを作成することをお勧めします。これはよりクリーンであり、別の名前によって、デフォルトの Python 環境を使用していないことが警告されます。

于 2009-12-26T15:25:31.370 に答える
1

本当にこれを行いたい場合は、PYTHONSTARTUP環境変数がファイルを指すように設定してください。sh、などではkshbash次のことができます。

PYTHONSTARTUP=$HOME/.pystartup
export PYTHONSTARTUP

$PYTHONSTARTUP次に、ステートメントとコードをファイルに入れることができます。

echo "import blah" >>$PYTHONSTARTUP

それはそれを行う必要があります。インタラクティブなセッションでのみ機能します。

于 2009-12-26T15:26:01.930 に答える
0

いいえ。Pythonインタープリター自体に追加することもできますが、それはカスタムPythonバージョンを作成することを意味します。これはおそらくあなたが望むものではありません。

これimport <mymodule>は、モジュールをロードするためだけでなく、このモジュールを(main | current)名前空間で表示するためでもあります。実際のPythonインタープリターをハッキングせずにそれを実行できると、「明示的は暗黙的よりも優れている」に対して非常に強力に実行されます。

于 2009-12-26T14:30:34.523 に答える
0

組み込み Python でモジュールを事前にインポートする方法については、このブログ投稿をご覧ください。

C/C++ で Python を埋め込み、モジュールをインポートする

たとえば、Python で次のステートメントをシミュレートするには、次のようにします。

from hashlib import md5, sha1

Cで行います:

PyObject * subModules = PyList_New(0);
PyList_Append(subModules, PyString_FromString("md5"));
PyList_Append(subModules, PyString_FromString("sha1"));
PyObject * hashlibImports = PyImport_ImportModuleEx("hashlib", NULL, NULL, subModules);
PyObject * md5Module = PyObject_GetAttr(hashlibImports, PyString_FromString("md5"));
PyObject * sha1Module = PyObject_GetAttr(hashlibImports, PyString_FromString("sha1"));
PyObject * mainModule = PyImport_AddModule("__main__");
PyModule_AddObject(mainModule, "md5", md5Module);
PyModule_AddObject(mainModule, "sha1", sha1Module);

また、基本的に実行する記事で言及されているプロジェクトからの関連コードへのリンクは次のとおりです。

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

Python の初期化後。

于 2012-08-19T08:59:49.080 に答える