3

ファイルシステムのどこかに別のスクリプトをインポートしようとしているpythonスクリプトがあります(パスは実行時にのみ認識されます)。私の理解では、impモジュールを使用する必要があり、これは機能する可能性がありますが、モジュールをロードすると、インポートされたモジュールで使用されているモジュールが見つからないというエラーが表示されます。

コードは次のとおりです。

インポーター.py:

import imp
imp.load_compiled("my_module","full_path_to_my_module\\my_module.pyc")

my_module.py:

import sys
import another_module

importer.py を実行すると、htis エラー メッセージが表示されます。

ImportError: another_module という名前のモジュールがありません

ここで何がうまくいかないのですか?「importer.py」が「my_module.pyc」をロードしているときに、彼は「another_module」もロードしようとしていますが(それは良いことです)、間違った場所を探していると思われます(たとえば、「full_path_to_my_module」ではありません)

編集: システムパスに「full_path_to_my_module」を追加してみました:

import imp
import sys

sys.path.append(full_path_to_my_module)
imp.load_compiled("my_module",full_path_to_my_module+my_module)

しかし、私はまだ同じエラーが発生します

たぶん、私は必要のないことをします-これが私の目標です:「importer.py」内の「my_module.pyc」のすべての機能を使用できるようにしたいです。ただし、「my_module.pyc」の場所は、「importer.py」へのパラメーターとして指定されます。

4

4 に答える 4

9

imp.load_compiledコンパイルされたモジュールオブジェクトを返します。これはimport、モジュールを名前にバインドするステートメントとも異なります

import imp
my_module = imp.load_compiled("my_module", "full_path_to_my_module/my_module.pyc")

次に、次のようなことができます。

my_module.yayfunctions('a')

完全なサンプル セッション:

$ cat /tmp/my_module.py
def yayfunctions(a):
    print a
$ python -m compileall /tmp/my_module.py
$ ls /tmp/my_module.py*
my_module.py   my_module.pyc
$ python
>>> import imp
>>> my_module = imp.load_compiled("my_module", "/tmp/my_module.pyc")
>>> my_module.yayfunctions('a')
a

コメント ( ImportError: No module named another_module) に関する編集、エラーの原因は のコードでmy_module.pycありanother_module.py、同じディレクトリに住んでいると想定しています

その場合、他の人が示唆しているように、通常のインポートメカニズムを含むディレクトリを追加して使用する方が簡単です。具体的にmy_modulesys.path__import__

これがあなたが望むことをするべき関数です:

import os


def load_path(filepath):
    """Given a path like /path/to/my_module.pyc (or .py) imports the
    module and returns it
    """

    path, fname = os.path.split(filepath)
    modulename, _ = os.path.splitext(fname)

    if path not in sys.path:    
        sys.path.insert(0, path)

    return __import__(modulename)


if __name__ == '__main__':
    # Example usage
    my_module = load_path('/tmp/my_module.py')
    my_module.yayfunctions('test')
于 2012-08-23T16:43:37.160 に答える
3

これは、import another_module「full_path_to_my_module」の範囲が不明であるためです。

代わりに、パスを既知のパスに追加しようとしましたか:

import sys
sys.path.append("full_path_to_my_module")
于 2012-08-23T16:43:27.083 に答える
1

実際に imp モジュールを使用して pyc モジュールをロードする必要はありません。

これを試す簡単な方法は、2 つの Python モジュールを作成し、一方が他方からインポートして実行することです。次に、インポートされた .py ファイルを削除して、.pyc ファイルのみが残るようにします。スクリプトを実行すると、インポートは正常に機能します。

ただし、ランダムなディレクトリから py ファイルをインポートする場合は、インポートする前にそのディレクトリを python パスに追加することをお勧めします。

例えば:

import sys
sys.path.insert(0, "/home/user/myrandomdirectory")
于 2012-08-23T16:43:06.430 に答える
0

pyc ファイルのロードは、コンパイル手順を実行しないことを除いて、py ファイルのロードとまったく同じように機能します。したがってimport mymodule、pyc のバージョン番号が実行中の python と同じである限り、使用するだけで機能します。そうしないと、マジック ナンバー エラーが発生します。

モジュールがパスにない場合は、それを sys に追加する必要があります。サブディレクトリの場合は、そのディレクトリに__init__.pyファイルを追加します。

于 2012-08-23T16:44:09.383 に答える