13


13

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

  • init * .pyに巧妙なハックがあるかもしれません。

追加:

それはグローバルである必要があります - つまり、他のスクリプトは標準で 'プロジェクト’をロードします:

プロジェクトをインポート

代わりにa40bd22344をロードして、正しく機能しなければなりません。

3 Answer


24


Pythonで `+ imp +`モジュールを使用して、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 +`モジュールに関する優れたドキュメントへのリンクを次に示します。

  • _http://docs.python.org/library/imp.html [imp —インポートにアクセスする 内部] _


19


最初に* import *を使ってインポートします。

>>> __import__('temp/a40bd22344')

次に、このモジュールがPythonで `+ project +`として認識されるようにします。

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

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

>>> import project
>>> project

これはサブモジュールでも動作します。同じ場所にfoobar.pyがあるとします。

>>> import project.foobar
>>> project.foobar

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

>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]


17


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

フルパスを引数として使用し、 `+ project `の_global_インポートを適切に設定する(および魔法のように ` 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も残します。