zipfile(圧縮されたpy2exeで構築)からすべてのモジュール(プリコンパイル済み)を読み込んでメモリにロードする必要があります。 これはzipファイルから直接ロードすることで行うことができますが、私はそれらをメモリからロードする必要があることを知っています。 アイデア(Windows上でPython 2.5.2を使用しています) TIA Steveメモリからコンパイル済みのPythonモジュールをロードするには?
答えて
「モジュール(プリコンパイル済み)」の正確な内容によって異なります。
$ cat>'ciao.py'
def ciao(): return 'Ciao!'
$ python -c'import ciao; print ciao.ciao()'
Ciao!
IOW、これ建てたciao.pyc
、あなたが今やると言う:によって建てられたとのは、それは例えば、.pyc
ファイルの正確内容だciao.pyc
を想定してみましょう
$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> b = open('ciao.pyc', 'rb').read()
>>> len(b)
200
をし、あなたの目標はにありますそのバイト文字列b
からインポート可能なモジュールciao
に移動します。
>>> import marshal
>>> c = marshal.loads(b[8:])
>>> c
<code object <module> at 0x65188, file "ciao.py", line 1>
これはあなたが.pyc
バイナリコンテンツからのコードオブジェクトを取得する方法である:ここでは方法です。 を編集します。最初の8バイトは「マジックナンバー」とタイムスタンプです(ここでは必要ありません)(正当性を確認し、例外が発生しない限り、質問:marshal.loads
は、とにかく破損文字列を検出した場合に発生します)。
その後:
>>> import types
>>> m = types.ModuleType('ciao')
>>> import sys
>>> sys.modules['ciao'] = m
>>> exec c in m.__dict__
すなわち:新しいモジュールオブジェクトを作成し、sys.modules
でそれをインストールし、その__dict__
にコードオブジェクトを実行することで、それを取り込みます。 を編集してください:sys.modules
を挿入する順番とexec
の順番は問題ありませんが、これはPythonの独自の順番であるため、具体的な内容はありません欠点)。
いくつかの方法で(たとえば、new
とimp
などの標準ライブラリモジュールの関数から)新しいモジュールオブジェクトを作成できますが、「インスタンスを取得するために型を呼び出す」ことは、タイプを取得するための通常の場所(名前が組み込まれていないか、そうでなければ手軽に使っている場合を除く)は、標準ライブラリモジュールtypes
からのものです。
さて、最後に:
>>> import ciao
>>> ciao.ciao()
'Ciao!'
>>>
...あなたはモジュールをインポートするというようにその関数、クラス、およびを使用することができます。他のimport
(およびfrom
)ステートメントは、この操作のシーケンスを繰り返す必要はないので、sys.modules['ciao']
というモジュールを見つけることになります。import
文が必要です他の場所からインポートすることができます - 私はそれが動作することを示すためにのみ追加しています;-)。
編集:あなたは絶対にパッケージやモジュールではなく、私がちょうどあったとして「プレーンモジュール」よりも、そこからこの方法でインポートする必要がある場合は、それはあまりにも、なんとかだが、少し複雑。この答えはすでにかなり長いので、この目的のためにプレーンなモジュールに固執してあなたの人生を単純化することができたら幸いです。
「メモリから同じモジュールを複数回ロードする」場合は、これが必要な場合とできない場合があります(これはモジュールを毎回再構築するため、sys.modulesをチェックし、 (ロックが必要ですが、より良いアーキテクチャは、タスクを実行するための専用のスレッドを1つ持つことです。他のモジュールは、そのモジュールと通信しています)。キュー)。
最後に、import
ステートメント内部機構のメカニズムに自動的に関与する透過的な「インポートフック」としてこの機能をインストールする方法については何も言及していません - それは実行可能でもありませんが、私はあなたの人生を単純化することができます、この答えが概説しているように、単純な方法で代わりにしてください。
、Pythonのファイルは、我々は新しいソースを持っているかどうかを確認する
- マジックナンバー(4バイト)タイプとPythonのバージョンを決定するために、
- タイムスタンプ(4バイト)で構成されてコンパイルさ
- マーシャリングコードオブジェクト。
あなたは、imp.new_module()
でモジュールオブジェクトを作成するには、新しいモジュールの名前空間にunmashaledコードを実行し、sys.modules
でそれを置くために持っているモジュールをロードします。サンプル実装における下:
import sys, imp, marshal
def load_compiled_from_memory(name, filename, data, ispackage=False):
if data[:4]!=imp.get_magic():
raise ImportError('Bad magic number in %s' % filename)
# Ignore timestamp in data[4:8]
code = marshal.loads(data[8:])
imp.acquire_lock() # Required in threaded applications
try:
mod = imp.new_module(name)
sys.modules[name] = mod # To handle circular and submodule imports
# it should come before exec.
try:
mod.__file__ = filename # Is not so important.
# For package you have to set mod.__path__ here.
# Here I handle simple cases only.
if ispackage:
mod.__path__ = [name.replace('.', '/')]
exec code in mod.__dict__
except:
del sys.modules[name]
raise
finally:
imp.release_lock()
return mod
更新:コードが正しくパッケージを処理するように更新されます。
ロードされたモジュール内でインポートを処理するには、インポートフックをインストールする必要があります。これを行う1つの方法は、ファインダーをsys.meta_path
に追加することです。詳細については、PEP302を参照してください。
- 1. コンパイル済みPython CGI
- 2. WindowsインストールでCygwinコンパイル済みPythonモジュールをインストールする
- 3. インストール済みのPythonモジュールx.features2dをOpencvからインポート
- 4. PythonモジュールのJinjaテンプレート(プリコンパイル済みテンプレート)
- 5. コンパイル済みのPythonコードVs py2exe
- 6. コンパイル済みPHP?
- 7. コンパイル済みのクエリ
- 8. サーバにコンパイル済みコードをアップロードする
- 9. コンパイル済みのPythonファイルをインポートすることはできますか?
- 10. VB6コンパイル済み実行ファイルのサイズを減らすには?
- 11. Pythonのリストで使用済みメモリをすぐに解放する方法は?
- 12. Pythonの:あなたは、モジュールからコンパイルPythonバイトコードを見れば、なぜ `return`モジュール
- 13. Pythonイメージング:メモリからjpegをロード
- 14. コンパイル済みjarライブラリからjavadoc Webを作成する
- 15. AngularJSからコンパイル済みHTMLを取得する
- 16. コンパイル済みの.jasperファイルからJasperReportオブジェクトを作成するには?
- 17. コンパイルされたコンパイル済みのプログラミング言語は何ですか?
- 18. ロード・モジュールからコンパイル・オプションを判別する - IBM Enterprise COBOL
- 19. pydev:コンパイル済みモジュールをインポートするときの未定義の変数エラー
- 20. コンパイル済みの.Net Exe
- 21. コンパイル済みのLinQクエリ
- 22. インポートでのPythonコンパイル済みファイルの優先順位は何ですか?
- 23. メモリ内の文字列からnode.jsモジュールをロード
- 24. コンパイル済みLINQクエリとDataLoadOptions ...
- 25. 奇数コンパイル済みコード
- 26. Python GUIのCコンパイル済みコードの使用
- 27. コンパイル済みPHPファイルからのエラーメッセージのキャプチャ
- 28. R:コンパイル済みコードの既存の接続から読む
- 29. ソフトウェア(コンパイル済みまたは翻訳済み)はどのようにエンドユーザーに届きますか?
- 30. コンパイル済み式から生成されたILコードを表示
もう少し背景を教えてもらえますか?最初にコードをメモリにロードする必要があるのはなぜですか?なぜZIPファイルからの読み込みが合わないのですか? – Ber