13

「/home/user/temp/a40bd22344」というフォルダがあるとします。名前は完全にランダムで、繰り返しごとに変わります。「プロジェクト」などの固定名を使用して、このフォルダーを Python にインポートできるようにする必要があります。このフォルダーを sys.path に追加してインポート ルックアップを有効にできることはわかっていますが、「a40bd22344」を「プロジェクト」に置き換える方法はありますか?

もしかしたらinit .pyに巧妙なハックがあるのでしょうか?

追加した:

グローバルである必要があります。つまり、標準を介して「プロジェクト」をロードする他のスクリプトです。

import project

代わりに a40bd22344 をロードして、適切に動作する必要があります。

4

3 に答える 3

25

impPython でモジュールを使用して、sys.path に触れずにそれを行う 1 つの方法を次に示します。

import imp

f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)

project.some_func()

impモジュールに関する優れたドキュメントへのリンクは次のとおりです。

于 2009-07-08T05:33:14.457 に答える
19

最初に import でインポートします:

>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

次に、このモジュールが Python に次のように認識されるようにしますproject

>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')

この後、現在の Python セッションでプロジェクトをインポートすると、元のモジュールが取得されます。

>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

これはサブモジュールでも機能します。同じ場所に foobar.py がある場合は、

>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>

補遺。これが私が実行しているものです:

>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
于 2009-07-08T10:21:15.250 に答える
17

確かに、適切に設定されproject = __import__('a40bd22344')た後sys.pathは機能します。

引数としてフルパスを取り、グローバルインポートをproject適切に設定する関数でそれを行いたいとします(import project後で魔法のように他のモジュールで作業を行います)。簡単なこと:

def weirdimport(fullpath):
  global project

  import os
  import sys
  sys.path.append(os.path.dirname(fullpath))
  try:
      project = __import__(os.path.basename(fullpath))
      sys.modules['project'] = project
  finally:
      del sys.path[-1]

これにより、sys.path も見つかったままになります。

于 2009-07-08T05:22:28.003 に答える